【发布时间】:2022-02-06 07:47:35
【问题描述】:
在 Spring MVC 应用程序中,关闭应用程序浏览器窗口是否会结束会话? 当打开一个新窗口时,就会启动一个新会话 我的理解正确吗?
【问题讨论】:
标签: spring spring-boot spring-mvc session
在 Spring MVC 应用程序中,关闭应用程序浏览器窗口是否会结束会话? 当打开一个新窗口时,就会启动一个新会话 我的理解正确吗?
【问题讨论】:
标签: spring spring-boot spring-mvc session
先从一些细节开始,然后在下面回答您的具体问题。
如果您有网络检查工具,您会注意到,当您的浏览器第一次与服务器交互时,响应中有一个类似于 Set-Cookie: JSESSIONID=<session_id> 的标头(假设是 Tomcat)。服务器创建了一个会话并提供了该会话 ID。当请求没有会话 ID 或会话 ID 无效时,服务器通常会创建一个新会话。此 cookie 存储在浏览器的 cookie 存储中,并将在后续请求中作为 Cookie 标头发送。
如果 cookie 没有定义过期时间,浏览器会将这个 cookie 视为会话 cookie,它是暂时的,或者只会在浏览器关闭之前存在。见https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie。
因此关闭浏览器只会丢失会话的客户端引用(会话 ID)。虽然服务器上的会话是孤立的(假设没有其他任何东西引用会话 ID),但会话仍然非常活跃。如果没有对该会话的进一步请求,则会话最终将超时并结束。您可以通过此属性配置超时 - server.servlet.session.timeout。
现在回答您的确切问题:
问:关闭应用程序浏览器窗口会结束会话吗?
浏览器 cookie 存储在关闭后将不再包含会话 ID。服务器会话将被孤立并最终超时/结束。
问:当打开一个新窗口时,就会启动一个新会话
如果浏览器已经打开并且您之前向服务器发出过一次请求,则打开另一个访问服务器的窗口不会创建新会话。两个窗口共享同一个 cookie 存储。
但如果您在启动浏览器进程或清除 cookie 后打开一个新窗口,则会创建一个新会话。同样,这是由于从浏览器到服务器的请求不包含会话 ID。
【讨论】: