在 Spring MVC 应用程序中,关闭应用程序浏览器窗口是否会结束会话? 当打开一个新窗口时,就会启动一个新会话 我的理解正确吗?
首先从一些细节开始,然后回答下面的具体问题。
如果您有网络检查工具,您会注意到浏览器第一次与服务器交互时,响应中会有一个看起来像
Set-Cookie: JSESSIONID=<session_id>
的标头(假设是 Tomcat)。服务器已经创建了一个会话并给出了该会话 ID。当请求没有会话 ID 或会话 ID 无效时,服务器通常会创建一个新会话。此 cookie 存储在浏览器的 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。
虽然我没有答案,但我对上述答案中的评论“浏览器 cookie 存储在关闭后将不再包含会话 ID”有反馈。服务器会话将被孤立并最终超时/结束。'
从安全角度来看,如果任何入侵者能够在会话超时之前进入服务器网络并检索该会话ID,他们就可以使用该会话ID对系统进行授权。不是吗?
如果上述理解正确,那么在没有注销应用程序的情况下关闭浏览器窗口的情况下,有哪些可能的选项可以使服务器端的会话 ID 无效?