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