有没有办法在Spring MVC中获取当前会话,但不是按请求获取。通常我们所做的是在Action / Controller类方法中获取请求。根据此请求,我们通过request.getSession()获取会话。但有没有办法让这个会话没有这个请求对象?
我的动机是,在一个实用程序类中,我需要访问在会话中设置的值,并且可以从超过50种Controller类方法访问此实用程序类方法。如果我必须从请求获得会话,那么我需要更改所有这50个地方。这看起来很乏味。请提出替代方案。
答案 0 :(得分:9)
我们总是可以在不传递HttpServletRequest的情况下从控制器空间中检索HttpSession。
Spring提供了将请求公开给当前线程的侦听器。您可以参考RequestContextListener。
此侦听器应在您的web.xml中注册
<listener>
<description>Servlet listener that exposes the request to the current thread</description>
<display-name>RequestContextListener</display-name>
<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>
这就是你如何从Session获取细节。
public final User getUser() {
RequestAttributes requestAttributes = RequestContextHolder
.currentRequestAttributes();
ServletRequestAttributes attributes = (ServletRequestAttributes) requestAttributes;
HttpServletRequest request = attributes.getRequest();
HttpSession httpSession = request.getSession(true);
Object userObject = httpSession.getAttribute("WEB_USER");
if (userObject == null) {
return null;
}
User user = (User) userObject;
return user;
}