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

时间:2012-02-01 12:49:05

标签: session browser spring-security

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

 <concurrency-control max-sessions="1" error-if-maximum-exceeded="true" />
  • 我打开浏览器并登录(例如IE9)
  • 关闭浏览器
  • 我打开另一个浏览器(例如Firefox)
  • 我无法登录,因为我仍在其他浏览器上登录

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

谢谢!

2 个答案:

答案 0 :(得分:3)

我会在&#34; CONCURRENT_SESSION_FILTER&#34;之前添加我自己的自定义过滤器。并检查请求URI中的字符串,如&#34; force-logout.do&#34; (或类似的东西)。

然后,在生成的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>

这适用于IE和Firefox(您也应该检查其他浏览器)。您的过滤器只需要检查URI并执行session.invalidate(),以防它与&#34;强制注销URI&#34;匹配。并立即返回或者只是绕过请求到过滤器链。

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

答案 1 :(得分:1)

我有类似的问题,比如

  1. 如果您使用某个用户登录zzzz
  2. 登录
  3. 您关闭了浏览器
  4. 再次尝试使用同一用户zzzz
  5. 登录
  6. 无法使用超出最大会话数的消息登录
  7. 我在Spring安全文件中的代码是:

    <session-management invalid-session-url="/?timeout=true">
    <concurrency-control max-sessions="1" expired-url="/logout?timeout" />
    

    我通过在web.xml文件中添加会话超时条目解决了这个问题。 我将会话超时值设为5分钟,构建应用程序并进行部署。 工作正常。

    这可能会对某人有所帮助。

    谢谢, 阿图尔