Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Tomcat如何跨多个请求维护相同的会话对象?_Java_Session_Tomcat_Servlets_Jakarta Ee - Fatal编程技术网

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

Java Tomcat如何跨多个请求维护相同的会话对象?,java,session,tomcat,servlets,jakarta-ee,Java,Session,Tomcat,Servlets,Jakarta Ee,我已经读到,每次向tomcat发出一个servlet的HTTP请求时,它都会创建一个新的HTTPRequest对象,使用该请求对象,我们可以访问会话对象并存储信息。此会话对象跨多个请求存储信息 我想了解tomcat是否正在为来自浏览器的每个请求创建一个新的HTTPRequest对象,然后它如何能够跨多个请求附加相同的会话对象?尽管HTTPRequest对象是为每个请求创建的,但HttpSession对象在请求之间保持不变。会话由JSESSONID cookie或请求参数标识,以防禁用cookie

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

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

尽管HTTPRequest对象是为每个请求创建的,但HttpSession对象在请求之间保持不变。会话由JSESSONID cookie或请求参数标识,以防禁用cookie,如中所述

根据:

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

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

根据:

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


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


请求对象提供对HTTP请求的所有信息的访问,例如请求头和请求体。response对象提供了控制和发送HTTP响应的工具,如设置标题和正文(通常使用JSP文件中的HTML内容)。当HTTP响应提交并完成时,请求和响应对象都将被丢弃。来源:

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


请求对象提供对HTTP请求的所有信息的访问,例如请求头和请求体。response对象提供了控制和发送HTTP响应的工具,如设置标题和正文(通常使用JSP文件中的HTML内容)。当HTTP响应提交并完成时,请求和响应对象都将被丢弃。来源:

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

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

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

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

注意:也不能保证连接到同一会话的后续请求会返回相同的HttpSession实际实例
首先,需要注意的是,servlet容器不一定为每个请求创建HttpServletRequest的新实例

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

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

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

注意:也不能保证连接到同一会话的后续请求会返回相同的HttpSession实际实例 实际上,Tomcat会回收HttpServletRequest的实例,所以正如您所说,servlet容器不一定会创建新的HttpServletRequest和HttpServletResponse对象。这意味着一个servlet可以接收同一个HttpServletRequest实例,因为多个请求只包含不同的内部状态。因此,由于HttpServletRequest对象不是不可变的,因此确保HttpServletRequest对象在单个请求的生命周期之外的任何地方都不被引用是至关重要的,servlet容器将创建新的HttpServletRequest和HttpServletResponse对象。这意味着一个servlet可以接收同一个HttpServletRequest实例,因为多个请求只包含不同的内部状态。因此,由于HttpServletRequest对象不是不可变的,因此确保HttpServletRequest对象在单个请求生命周期之外的任何地方都没有被引用是至关重要的。