2

我正在使用 Spring Security 3 并且我的 ApplicationContext-Security.xml 指定

 <form-login login-page="/genesis" default-target-url="/diagnostics/start-diagnostics"
      authentication-failure-url="/genesis?authfailed=true"
      authentication-success-handler-ref="customTargetUrlResolver"/>
      <access-denied-handler error-page="/genesis?notauthorized=true"/>

     <logout logout-success-url="/genesis"/> 

    <session-management session-authentication-error-url="/genesis"> 
            <concurrency-control max-sessions="1"/>
    </session-management>

但是,当我在第二个浏览器中登录我的应用程序时,当我尝试执行任何操作时立即返回到我的第一个浏览器,我得到一个纯白屏幕,并显示消息“此会话已过期(可能是由于尝试了多个并发登录)作为同一用户”

如何配置 Spring Security 3 以显示我自己的“您已断开连接”URL?

4

1 回答 1

7

您可以:

  • 强制并发过滤器抛出身份验证异常(它将由 处理<form-login>),
  • 提供您自己的会话过期页面。

Spring Security 手册中描述了这些情况:

<concurrency-control>属性

error-if-maximum-exceeded

如果设置为“true”,当用户尝试超过允许的最大会话数时,将引发 SessionAuthenticationException。默认行为是使原始会话过期。

expired-url

如果用户尝试使用已被并发会话控制器“过期”的会话,则用户将被重定向到的 URL,因为用户已超过允许的会话数并在其他地方再次登录。除非设置了 exception-if-maximum-exceeded,否则应该设置。如果未提供任何值,则将直接将过期消息写回响应。

另请检查ConcurrentSessionFilterConcurrentSessionControlStrategy了解更多详细信息。


回答你的问题:在你的配置中你应该有这样的东西:

<session-management session-authentication-error-url="/genesis"> 
    <concurrency-control max-sessions="1" expired-url="/sessionExpired.jsp" />
</session-management>

请注意,expired-url与 不一样session-authentication-error-url

于 2012-06-18T12:55:30.190 回答