在Controller类中全局声明HttpSession?

时间:2016-05-27 10:29:08

标签: java spring-mvc controller httpsession request-mapping

我在Controller类中有2 @RequestMapping,两者都有HttpSession httpSession

是否可以全局声明HttpSession httpSession,以便我可以声明HttpSession一次,并且可以在多个函数中使用?

@Controller
public class ControllerClass{

    @RequestMapping(value="/sectionsAjax", method=RequestMethod.POST)
    public @ResponseBody String sectionsAjax(HttpSession httpSession){
        // Code
    }

    @RequestMapping(value="loadAjax", method=RequestMethod.POST)
    public @ResponseBody String sectionsAjax(HttpSession httpSession){
        // Code
    }
}

2 个答案:

答案 0 :(得分:1)

未在请求的上下文中运行,您可能没有HttpSession可用。即使在请求的上下文中,也可能(还)没有创建会话。

适合您的情况(虽然它并不比您当前的方法更好)是使用spring RequestContextHolder

这样的东西
public static HttpSession getHttpSession() {
    ServletRequestAttributes attr = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
    return attr.getRequest().getSession(true);
}

将始终工作(在getRequestAttributes中不添加null的检查后)在servlet容器中创建(如果没有,则创建会话)。

要扩展一下,就像你向控制器注入HttpSession(或者#34;全局声明")一样。 Spring的控制器(即底层的Java对象)是非常长寿的单例对象,具有所谓的"单例范围"。会话是"会话范围"的对象。所以不能直接注入控制器(依赖必须是同等或更长的生活)。可以使用代理(在这种情况下具有单例范围)来解析具有例如单值的代理。会话范围;但在你的情况下,这不值得麻烦。有关详细信息,请参阅spring非常好的参考资料,特别是在Bean scopes一章中。

答案 1 :(得分:0)

我认为您可以在控制器中自动装配HttpSession:

@Autowired
private HttpSession session;