java - 在 Controller 类中全局声明 HttpSession?

标签 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
    }
}

最佳答案

未在请求上下文中运行,您可能没有可用的 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/

相关文章:

java - VLCj:如何设置运动模糊?

java - 通过 eclipse 和 maven2 插件部署到 tomcat 似乎不起作用

java - Kafka-server-stop 无法在 Windows 中进行受控关闭

java - Hibernate初学者疑惑

forms - Spring 形式 :options tag with enum

javascript - ng-table angularJS 的实现

java - 通过 Java FX Controller 将数据传递到其他 View

json - 无法将 json 数据输入 Controller , Controller 将 JSON 请求显示为空;

java - Spring Controller 处理所有其他 Controller 不匹配的请求

java - 在 Jetty Serverlet doGet 方法中显示资源文件夹中的静态 HTML 文件