2013-05-31 87 views
4

當會話超時時,我試圖讓JSF Web前端重定向回到登錄頁面(在Spring Security中)。在Spring Security中重定向處理會話超時時的PrimeFaces Ajax請求

我嘗試過使用元刷新方法,但是這會導致不希望的副作用,即當頁面上只使用AJAX控件時,不會更新元刷新時間。這意味着,當您仍在使用頁面時,頁面可能會刷新,因爲您尚未轉換到其他頁面,並且僅向服務器發出了AJAX調用。我還沒有找到一種方法來使用Primefaces輕鬆改變這種行爲。

當會話過期時,Spring Security發送302 HTTP錯誤消息給Primefaces,但是Primefaces只是忽略重定向請求。您可以知道會話何時到期,因爲Primefaces控件由於其AJAX調用未成功而停止響應。

我已經在Glassfish 3.1.2.2上運行Primefaces 3.4.2和Spring Security 3.1.4。

回答

12

這是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

+3

一個音符從我的(成功)實現你的答案在這裏:不要清除cookie,然後觸發ajax請求作爲測試此方法的一種方法!與過期會話相同,新的無會話請求不會被視爲「無效」! – Dan

相關問題