【问题标题】:Spring when is HTTPSession created if all controllers are singleton如果所有控制器都是单例的,那么什么时候创建 HTTPSession
【发布时间】:2011-05-03 21:24:39
【问题描述】:

我正在学习 Spring 3 并试图了解 HTTPSession 何时创建以及生命周期是什么。我所有的控制器都是单例的(默认情况下),我配置了HttpSessionListener。我观察到sessionCreated 永远不会被调用。

但是当我将LoginController 设为Session 范围控制器时,sessionCreated 会被调用。我想知道弹簧控制器如何管理HttpSession。另外,另一个问题是让我们说来自浏览器的第一个请求到达LoinController 并创建HttpSession - 然后从该浏览器到不同控制器(这是单例)的后续请求将使用相同的 HTTPSession 还是它是无状态的?有人可以帮忙吗?

【问题讨论】:

    标签: spring spring-mvc controller


    【解决方案1】:

    控制器是单例和无状态的。调度程序 servlet 调用所需的控制器方法并将会话传递给它。会话由调度程序 servlet 通过调用request.getSession() 获得。因为它是一个普通的 servlet,所以容器“给”它任何 servlet 在每个请求上获得的请求和响应。

    也就是说,servlet 也是单例的(每个上下文都有一个实例)。并且多个线程(= 请求)正在调用它的方法。

    最后一点 - 会话范围的 bean 很少需要。根据我的经验,您可以拥有一个没有任何会话范围 bean 的整个应用程序。

    【讨论】:

    • 是的,默认情况下控制器是单例的,但可以通过使用注释将它们配置为会话范围。如果我混合了会话范围控制器和单例控制器,那么它们是否为来自同一浏览器的所有请求共享相同的 HTTPSession?
    • @integral_dev 不同之处在于会话范围的控制器可以具有状态 - 即您可以为其字段分配值,并且它们对于每个用户会话都是唯一的..
    【解决方案2】:

    一个会话关联多个 HTTP 请求,因此一旦为用户创建了会话,servlet 引擎就会使用 cookie 或 URL 重写来维护它。

    【讨论】:

    • 感谢您的回复。是的,会话关联了多个请求——但即使它转发给单例控制器?此外,该会话的生命周期是如何由 serverlet 引擎维护的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-13
    • 2013-12-19
    • 2013-01-16
    • 1970-01-01
    • 2014-09-14
    • 2016-02-23
    • 2016-10-07
    相关资源
    最近更新 更多