如何在没有要求的情况下获得春季课程?

时间:2016-06-27 10:15:41

标签: java spring spring-mvc session

有没有办法在Spring MVC中获取当前会话,但不是按请求获取。通常我们所做的是在Action / Controller类方法中获取请求。根据此请求,我们通过request.getSession()获取会话。但有没有办法让这个会话没有这个请求对象?

我的动机是,在一个实用程序类中,我需要访问在会话中设置的值,并且可以从超过50种Controller类方法访问此实用程序类方法。如果我必须从请求获得会话,那么我需要更改所有这50个地方。这看起来很乏味。请提出替代方案。

1 个答案:

答案 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;
}