我在下面的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
}
}
最佳答案
未在请求上下文中运行,您可能没有可用的 HttpSession
。即使在请求的上下文中,也可能(尚未)创建任何 session 。
可能适合您的情况(尽管它并不比您当前的方法更好)是使用 spring 的 RequestContextHolder .
类似的东西
public static HttpSession getHttpSession() {
ServletRequestAttributes attr = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
return attr.getRequest().getSession(true);
}
将始终在 servlet 容器中工作(在添加对 getRequestAttributes
的检查后不返回 null
)(创建 session ,如果没有)。
扩展一下,当您询问如何将 HttpSession 注入(inject)(或“全局声明”)到 Controller 中时。 Spring 的 Controller (即底层 Java 对象)是非常长寿的单例对象,具有所谓的“单例范围”。 session 是“ session 范围”的对象,因此不能直接注入(inject)到 Controller (依赖项必须具有相同或更长的生命周期)。人们可以使用代理(在这种情况下具有单例范围)来解析具有例如 session 范围;但就你的情况来说,这不值得这么麻烦。有关更多信息,请参阅 spring 的非常好的引用资料,特别是章节 Bean scopes .
关于java - 在 Controller 类中全局声明 HttpSession?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37481091/