rac*_*mir 4 ajax spring-security session-timeout primefaces jsf-2
当会话超时时,我试图让JSF Web前端重定向回到登录页面(在Spring Security中).
我尝试过使用元刷新方法,但这会导致不希望的副作用,即当页面上只使用AJAX控件时,元刷新时间不会更新.这意味着页面可能会在您仍在使用时刷新,因为您尚未转换到另一个页面并且只对服务器进行了AJAX调用.我还没有找到一种方法来使用Primefaces轻松改变这种行为.
当会话过期时,Spring Security会向Primefaces发送302 HTTP错误消息,但Primefaces会忽略重定向请求.您可以判断会话何时到期,因为Primefaces控件因其AJAX调用未成功而停止响应.
我使用的是Primefaces 3.4.2,以及在Glassfish 3.1.2.2上运行的Spring Security 3.1.4.
rac*_*mir 12
这是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>
Run Code Online (Sandbox Code Playgroud)
要覆盖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"/>
Run Code Online (Sandbox Code Playgroud)
然后,您需要将此过滤器添加到Spring Security HTTP块:
<security:http use-expressions="true">
<security:custom-filter ref="sessionManagementFilter" before="SESSION_MANAGEMENT_FILTER" />
...
</security:http>
Run Code Online (Sandbox Code Playgroud)
现在,应用程序启动时将创建自定义会话管理筛选器,并且只要找到过期的会话,就会执行提供的无效会话策略类.
可以在此处找到如何实现无效会话策略的一个很好的示例:https://gist.github.com/banterCZ/5160269
这里有一个使用IceFaces的类似问题:JSF 2,Spring Security 3.x和Richfaces 4在会话超时时重定向到登录页面以获取ajax请求
归档时间: |
|
查看次数: |
9131 次 |
最近记录: |