【问题标题】:Spring Security doesn't kill session when browser closes浏览器关闭时 Spring Security 不会终止会话
【发布时间】:2012-02-24 03:34:47
【问题描述】:

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

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

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

谢谢!

【问题讨论】:

    标签: session browser spring-security


    【解决方案1】:

    我会在“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>
    

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

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

    【讨论】:

    • 谢谢阿隆索!我也有同样的想法,但我不确定是否有一些特定的弹簧安全机制可以处理这种情况。
    • 根据 Spring Security 3.1 的文档,似乎没有,实际上他们通知在您的场景中,会话到期之前的两次后续访问将引发异常,但如果会话同时到期,则一个新的会话将开始。问题是他们没有提供支持的机制来让它在浏览器关闭的那一刻过期。
    • 谢谢,感谢您的帮助!
    【解决方案2】:

    我也有类似的问题,比如

    1. 如果您使用某些用户登录,请说 zzzz
    2. 您关闭了浏览器
    3. 再次尝试使用同一用户 zzzz 登录
    4. 登录失败并显示超出最大会话的消息

    我的 spring 安全文件中的代码是:

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

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

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

    谢谢, 阿图尔

    【讨论】:

      猜你喜欢
      • 2015-04-23
      • 1970-01-01
      • 1970-01-01
      • 2010-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-17
      • 2013-08-11
      相关资源
      最近更新 更多