Tomcat如何跨多个请求维护相同的会话对象?

时间:2018-05-16 17:10:08

标签: java session tomcat servlets java-ee

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

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

3 个答案:

答案 0 :(得分:1)

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

请求对象提供对HTTP请求的所有信息的访问,例如请求标头和请求主体。响应对象提供了以您希望的方式控制和发送HTTP响应的工具,例如设置标头和正文(通常使用JSP文件中的HTML内容)。提交并完成HTTP响应后,请求和响应对象都将被删除。资料来源:https://howtodoinjava.com/server/tomcat/a-birds-eye-view-on-how-web-servers-work/

答案 1 :(得分:0)

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

根据Servlet 3.0 Specification

  

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

答案 2 :(得分:0)

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

例如,

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

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

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

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