Spring Servlet中的请求和会话

Spring Servlet中的请求和会话,spring,session,tomcat,servlets,Spring,Session,Tomcat,Servlets,我有一个非常简单的问题,关于网络中的请求和会话。当我多次从具有不同选项卡的同一浏览器或通过新窗口请求同一页面时,会话ID和会话创建时间是相同的 这是我在internet explorer中完成的。但当使用不同的浏览器(如谷歌浏览器)访问同一页面时,会出现不同的会话id和会话创建时间。据我所知,http请求是无状态的 所以,在我的例子中,它在同一个浏览器中似乎不是无状态的,因为对于不同的http请求,新线程是通过容器创建新的servlet来创建的。因此,我得出以下结论: 如果请求是从打开了不同选项

我有一个非常简单的问题,关于网络中的请求和会话。当我多次从具有不同选项卡的同一浏览器或通过新窗口请求同一页面时,会话ID和会话创建时间是相同的

这是我在internet explorer中完成的。但当使用不同的浏览器(如谷歌浏览器)访问同一页面时,会出现不同的会话id和会话创建时间。据我所知,http请求是无状态的

所以,在我的例子中,它在同一个浏览器中似乎不是无状态的,因为对于不同的http请求,新线程是通过容器创建新的servlet来创建的。因此,我得出以下结论:


如果请求是从打开了不同选项卡的同一浏览器发送的,或者是通过另一个新窗口发送的,那么请求总是使用相同的线程来执行具有相同会话Id的servlet操作。如果请求是从不同的浏览器发送的,那么新的http请求将使用新的会话Id发送。那么,我的问题是,它是无状态的吗?是否从不同的浏览器同时发送请求?如果我在春季声明
scope=“request”>
scope=“session”>
,那么它也遵循同样的情况?如果我的理解有误,请更正。

当服务器应用程序启动新会话时,servlet容器会将带有
JSESSIONID
Set Cookie
头发送回浏览器。浏览器保存该cookie,并将其与每个请求一起发送回服务器,而不管您从哪个选项卡发出请求。显然,其他浏览器无法访问该cookie,因此它们将从服务器接收另一个cookie

当您的服务器收到带有
JSESSIONID
cookie的请求时,它可以将该请求与先前发出的具有相同id的请求关联起来。serlvet容器能够将不同的属性与该id关联,并在请求之间持久化这些属性。http会话对象基本上是这些属性的容器,您的服务器应用程序可以对其进行读/写访问。基本上,这就是在无状态http协议之上使用http会话实现状态完整性的方式

至于线程:每个请求都可以由任意随机线程处理,因为会话数据没有绑定到特定线程。servlet容器维护从会话id到包含不同属性的会话对象的映射。因此,任何随机线程都可以基于会话id访问属于当前请求的会话对象


在Spring中,
request
scope意味着为每个请求新创建一个bean实例,而
会话
作用域bean的生命周期绑定到http会话的生命周期。

Spring

scope="request"
为每个请求创建新的bean实例

 scope="session"
在每个会话中创建新的bean实例,并在整个会话生命周期中维护bean实例


无论浏览器如何,Http协议都是无状态的。状态完整性通过cookie和会话实现

当从浏览器发送请求时,服务器创建会话并将唯一id发送回客户端。客户端在后续请求中使用此id(Cookie),以便服务器能够识别请求并将其与会话关联

就请求而言,服务器创建单独的线程来处理每个请求,而不考虑窗口、选项卡或浏览器。但是,每个浏览器将只创建一个会话

注意:最新浏览器共享会话和从选项卡发出的请求,否则新窗口将使用相同的会话。最新的IE版本IE7、IE8和IE9被称为松耦合IE(LCIE)。查看此项了解更多详细信息