这是 Spring Security 将重定向发送回客户端的默认方式的问题。向客户端发送重定向的默认方法是发送 302 临时移动响应的 HTML 方法,但这不适用于 AJAX 客户端。AJAX 客户端将此解释为重定向到新位置以发布/获取其数据,而不是页面重定向。让 AJAX 客户端以与普通 HTML 请求相同的方式将浏览器重定向到新页面的正确方法是:
<?xml version=\"1.0\" encoding=\"UTF-8\"?>
<partial-response>
<redirect url="http://your.url.here/"></redirect>
</partial-response>
要覆盖 Spring Security 使用的默认无效会话策略,您需要在 Spring 配置中创建一个SessionManagementFilter bean,并向其传递一个实现InvalidSessionStrategy的类,并在通过 HTML 或 AJAX 接收到请求时发送正确的重定向响应:
<bean id="sessionManagementFilter" class="org.springframework.security.web.session.SessionManagementFilter">
<constructor-arg name="securityContextRepository" ref="httpSessionSecurityContextRepository" />
<property name="invalidSessionStrategy">
<bean class="yourpackage.JsfRedirectStrategy">
<constructor-arg name="invalidSessionUrl" value="/your_session_expired_page.xhtml" />
</bean>
</property>
</bean>
<bean id="httpSessionSecurityContextRepository" class="org.springframework.security.web.context.HttpSessionSecurityContextRepository"/>
然后,您需要将此过滤器添加到 Spring Security HTTP 块中:
<security:http use-expressions="true">
<security:custom-filter ref="sessionManagementFilter" before="SESSION_MANAGEMENT_FILTER" />
...
</security:http>
现在将在您的应用程序启动时创建自定义会话管理过滤器,并且只要找到过期会话,就会执行提供的无效会话策略类。
如何实现无效会话策略的一个很好的例子可以在这里找到:https ://gist.github.com/banterCZ/5160269
此处提供了使用 IceFaces 的类似问题:JSF 2, Spring Security 3.x and Richfaces 4 redirect to login page on session time out for ajax requests