我在网上有一个非常简单的请求和会话问题。当我从具有不同选项卡的相同浏览器或通过新窗口多次请求同一页面页面时,会话ID和会话创建时间相同。
这是我从Internet Explorer完成的。但是当使用谷歌浏览器等不同的浏览器并访问同一页面时,会出现不同的会话ID和会话创建时间。据我所知,http请求是无状态的。
因此,在我的情况下,它在同一浏览器中似乎不是无状态的,因为不同的http请求通过容器创建新的servlet来创建新线程。所以我得出了以下结论:
如果请求是从同一浏览器发送的,当时打开了不同的选项卡或通过另一个新窗口发送请求,请求始终使用相同的线程进行具有相同会话ID的servlet操作。如果请求是从不同的浏览器发送的,那么新的http请求将与新的会话ID一起发送。那么,我的问题是当它是无状态的时候?如果请求是从不同的浏览器同时发送的?如果我在春天宣布scope="request">
和scope="session">
那么它也遵循相同的情况?如果我理解错了,请纠正我。
答案 0 :(得分:1)
当您的服务器应用程序启动新会话时,servlet容器会将带有Set-Cookie
的{{1}}标头发送回浏览器。浏览器保存该cookie,并在每次请求时将其发送回服务器,而不管您发出请求的是哪个选项卡。很可能其他浏览器无法访问该cookie,因此他们将从服务器接收另一个浏览器。
当您的服务器收到带有JSESSIONID
cookie的请求时,它可以将该请求与之前具有相同ID的请求相关联。 serlvet容器能够将不同的属性与该id相关联,并在请求之间保留这些属性。 http会话对象基本上是这些属性的容器,服务器应用程序具有读/写访问权限。基本上,这就是在无状态的http协议之上使用http会话实现状态完善的方式。
对于线程:每个请求都可以由任何随机线程处理,因为会话数据没有绑定到特定线程。 servlet容器维护从会话id到包含不同属性的会话对象的映射。因此,任何随机线程都可以根据其会话ID访问属于当前请求的会话对象。
在Spring中,JSESSIONID
范围意味着为每个请求新创建一个bean实例,而request
范围bean的生命周期绑定到http会话的生命周期。
答案 1 :(得分:1)
春天
scope="request"
根据请求创建bean的新实例。
scope="session"
每个session创建一个新的bean实例。并在整个会话生命周期中维护bean的实例
答案 2 :(得分:1)
无论浏览器如何,Http协议都是无状态的。通过cookie和会话实现状态丰满。
当从浏览器发送请求时,服务器创建会话并将唯一ID发送回客户端。客户端在后续请求中使用此ID(Cookie),以便服务器可以识别请求并将其与会话关联。
就请求而言,无论窗口,选项卡或浏览器如何,服务器都会创建单独的线程来处理每个请求。但是,每个浏览器只会创建一个会话。
注意:最新的浏览器共享会话,并且从选项卡或新窗口发出的请求将使用相同的会话。最新的IE版本IE7,IE8和IE9被称为Loosely-Coupled IE(LCIE)。查看此详细信息LCIE