浏览器关闭时,Spring Security不会终止会话

use*_*479 6 browser session spring-security

我正在使用Spring Security 3.1并且正在使用

 <concurrency-control max-sessions="1" error-if-maximum-exceeded="true" />
Run Code Online (Sandbox Code Playgroud)
  • 我打开浏览器并登录(例如IE9)
  • 我关闭了那个浏览器
  • 我打开一个不同的浏览器(例如Firefox)
  • 我无法登录,因为我仍然登录其他浏览器

有没有办法在浏览器关闭时强制关闭会话?我需要将max-sessions保持为1以进行并发控制.

谢谢!

Alo*_*uez 3

我会在“CONCURRENT_SESSION_FILTER”之前添加一个自己的自定义过滤器,并检查请求 URI 中是否有“force-logout.do”(或类似的字符串)之类的字符串。

然后,在生成的 HTML 中,我将有一个如下所示的 JavaScript 事件处理程序:

<script type="text/javascript">
function force_logout() {
  // AJAX request to server notifying that the browser has been closed.
}
</script>

<body onbeforeunload="force_logout();">
</body>
Run Code Online (Sandbox Code Playgroud)

这适用于 IE 和 Firefox(您也应该检查其他浏览器)。您的过滤器只需要检查 URI 并执行操作,session.invalidate()以防它与“强制注销 URI”匹配,然后立即返回,否则就绕过对过滤器链的请求。

注意:我没有添加 AJAX 代码,因为我不知道您是否使用特定的 AJAX 框架。使用prototype.js,这将相当简单。