我正在尝试让JSF web前端在会话超时时重定向回登录页面(在Spring Security中)。
我尝试过使用元刷新方法,但是这会导致一个不受欢迎的副作用,即当页面上只使用AJAX控件时,元刷新时间将不会更新。这意味着页面可能会在您仍在使用时刷新,因为您没有转换到另一个页面,而只是对服务器进行了AJAX调用。我还没有找到一种使用Primefaces轻松改变这种行为的方法。
当会话过期时,Spring Security会向Primefaces返回一个302 HTTP错误消息,但是Primefaces会忽略重定向请求。您可以判断会话何时过期,因为Primefaces控件停止响应,因为它们的AJAX调用不成功。
我使用的是在Glassfish 3.1.2.2上运行的Primefaces 3.4.2和Spring Security 3.1.4。
发布于 2013-06-04 08:35:16
这是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
https://stackoverflow.com/questions/16858017
复制相似问题