這是Spring Security將重定向發送回客戶端的默認方式的一個問題。向客戶端發送重定向的默認方法是發送302 Temporarily Moved響應的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中使用的默認無效會話策略,你需要創建一個SessionManagementFilter豆在Spring的配置,並通過它實現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"/>
然後您需要添加此過濾到你的春季安全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
一個音符從我的(成功)實現你的答案在這裏:不要清除cookie,然後觸發ajax請求作爲測試此方法的一種方法!與過期會話相同,新的無會話請求不會被視爲「無效」! – Dan