【问题标题】:How does Tomcat maintain same session object across multiple request? [duplicate]Tomcat 如何跨多个请求维护相同的会话对象? [复制]
【发布时间】:2018-10-26 20:13:12
【问题描述】:

我已经读到,每次向 tomcat 发出 HTTP 请求以获取 servlet 时,它都会创建一个新的 HTTPRequest 对象,并且使用该请求对象,我们可以访问会话对象并存储信息。此会话对象存储跨多个请求的信息。

我想了解 tomcat 是否为来自浏览器的每个请求创建一个新的 HTTPRequest 对象,那么它如何能够跨多个请求附加相同的会话对象?

【问题讨论】:

    标签: java session tomcat servlets jakarta-ee


    【解决方案1】:

    Apache 是一个 servlet 容器。 servlet 容器连接到 web 服务器,该服务器在特定端口号(通常为 80)上侦听 HTTP 请求。当客户端(使用 web 浏览器的用户)发送 HTTP 请求时,servlet 容器将创建新的 HttpServletRequest 和 HttpServletResponse 对象并将其传递给已创建的 Filter 和 Servlet 实例的方法,它们的 URL 模式与请求 URL 匹配,所有这些都在同一个线程中。

    请求对象提供对 HTTP 请求的所有信息的访问,例如请求标头和请求正文。响应对象提供了以您想要的方式控制和发送 HTTP 响应的工具,例如设置标头和正文(通常带有来自 JSP 文件的 HTML 内容)。当 HTTP 响应提交并完成时,请求和响应对象都将被丢弃。来源:https://howtodoinjava.com/server/tomcat/a-birds-eye-view-on-how-web-servers-work/

    【讨论】:

    • 实际上,Tomcat 回收HttpServletRequest的实例,所以不一定如你所说,“servlet 容器将创建新的 HttpServletRequest 和 HttpServletResponse 对象”。这意味着 servlet 可以为多个请求接收HttpServletRequest相同实例(它们将只包含不同的内部状态)。因此,由于它不是不可变的,因此确保在单个请求的生命周期之外的任何地方都不会引用 HttpServletRequest 对象至关重要。
    【解决方案2】:

    虽然HttpRequest 对象是为每个请求创建的,但HttpSession 对象在请求之间保持不变。会话由 JESSSONID cookie 或请求参数(如果 cookie 被禁用)标识,如this answer 中所述。

    根据Servlet 3.0 Specification

    HttpSession 对象必须在应用程序(或 servlet 上下文)级别。底层机制,例如用于 建立会话,对于不同的上下文可以是相同的,但是 引用的对象,包括该对象中的属性,绝不能 由容器在上下文之间共享。

    【讨论】:

      【解决方案3】:

      首先,需要注意的是,servlet 容器不一定会为每个请求创建一个新的 HttpServletRequest 实例。

      例如,Tomcat 回收HttpServletRequest的现有实例作为性能优化以减少堆分配。提交响应后,它会重置现有 HttpServletRequest 实例的内部状态并为下一个请求重用同一实例HttpServletResponse 实例也是如此。

      因此,由于此对象不是不可变的,因此确保在单个请求的生命周期之外的任何地方都不会引用 HttpServletRequest 对象至关重要。

      回答 OP 的问题HttpSession 对象不是存储在 HttpServletRequest 字段中的东西。 HttpServletRequest.getSession() 只是一个 API 方法,servlet 引擎通常通过使用请求提供的会话 ID 从会话存储机制中检索 HttpSession 来实现它。

      • 注意:也不能保证对于连接到同一会话 (see this question) 的后续请求将返回相同的 HttpSession 实际实例

      【讨论】:

        猜你喜欢
        • 2013-12-17
        • 1970-01-01
        • 2020-06-19
        • 2023-03-14
        • 2011-03-14
        • 2011-08-02
        • 2015-01-07
        • 1970-01-01
        • 2013-11-25
        相关资源
        最近更新 更多