1

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

这是我从 Internet Explorer 完成的。但是,当使用不同的浏览器(如谷歌浏览器)并访问同一页面时,会出现不同的会话 ID 和会话创建时间。据我了解,http请求是无状态的。

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

如果请求是从打开不同选项卡的同一浏览器发送的,或者当时通过另一个新窗口发送请求,则请求始终使用相同的线程进行具有相同会话 ID 的 servlet 操作。如果请求是从不同的浏览器发送的,那么新的 http 请求将使用新的会话 ID 发送。所以,我的问题是什么时候它是无状态的?如果请求是从不同的浏览器同时发送的?如果我在春天宣布 scope="request">scope="session">那么它也遵循同样的情况吗?如果我的理解有误,请纠正我。

4

3 回答 3

1

当您的服务器应用程序启动一个新会话时,servlet 容器会向浏览器发送一个Set-Cookie带有返回值的标头。JSESSIONID浏览器保存该 cookie,并在每次请求时将其发送回服务器,无论您从哪个选项卡发出请求。显然其他浏览器无权访问该 cookie,因此它们将从服务器接收另一个。

当您的服务器收到带有JSESSIONIDcookie 的请求时,它可以将该请求与之前发出的具有相同 id 的请求相关联。serlvet 容器能够将不同的属性与该 id 相关联,并在请求之间保留这些属性。http session 对象基本上是这些属性的容器,您的服务器应用程序对其具有读/写访问权限。基本上,这就是在其他无状态的 http 协议之上使用 http 会话实现状态的方式。

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

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

于 2013-02-28T09:06:05.807 回答
1

春天

scope="request"

为每个请求创建新的 bean 实例。

 scope="session"

为每个会话创建新的 bean 实例。并在整个会话生命周期中维护 bean 实例

参考this以获得更好的理解

于 2013-02-28T09:07:12.950 回答
1

与浏览器无关,Http 协议是无状态的。State-fullness 是通过 cookie 和 session 实现的。

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

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

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

于 2013-02-28T09:24:17.227 回答