1

@RequestMapping在下面的 Controller 类中有 2 个,都有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
    }
}
4

2 回答 2

1

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

可能适合您的情况(尽管它并不比您当前的方法更好)是使用 spring 的RequestContextHolder

就像是

public static HttpSession getHttpSession() {
    ServletRequestAttributes attr = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
    return attr.getRequest().getSession(true);
}

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

为了扩展一点,正如您询问将 HttpSession 注入(或“全局声明”)到您的控制器中一样。Spring 的控制器(即底层 Java 对象)是寿命很长的单例对象,具有所谓的“单例范围”。会话是“会话范围”的对象,因此不能直接注入控制器(依赖项必须相同或更长时间)。可以使用代理(在这种情况下具有单例范围)解析具有会​​话范围的值;但在你的情况下,这不值得麻烦。有关更多信息,请查看 spring 的非常好的参考资料,特别是Bean scopes章节。

于 2016-05-27T11:34:52.143 回答
0

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

@Autowired
private HttpSession session;
于 2016-05-27T10:35:46.810 回答