2009-08-04 29 views
6

我有一系列彼此構建的註冊頁面。當用戶會話到期時,我有一個Listener,它可以清理服務器上的所有內容,並且效果很好。但是,如果用戶試圖做其他任何事情,我只想將它們重定向回系列的第一頁。但是,我的過濾器似乎不能正常工作。我一直得到javax.faces.application.ViewExpiredException在JSF和Richfaces中處理過期的ViewState

處理這個表達式的最佳做法是什麼?我不能在web.xml中處理,因爲這太全球化了。另外錯誤頁面正在從一些JSF代碼呈現 - 看來我需要捕捉到這是使用PhaseListener發生的,所以這個異常不會發生在第一位,但我一直沒能找到一個好的模型如何做到這一點。有任何想法嗎?

回答

1

我認爲你是一個階段偵聽器的正確軌道。基本上在第一頁的會話中設置一些東西。然後在階段偵聽器中查找會話中的值。如果它不退出然後做一個重定向。訣竅是在階段監聽器流程中儘早完成它。 不確定在您的階段偵聽器正在拋出異常的過程中的哪個位置。

0

您可以檢查是否會話是無效或不

布爾sessionInValid = httpServletRequest.getRequestedSessionId() = NULL & & httpServletRequest.isRequestedSessionIdValid();!

這裏的布爾變量sessionInValid將返回true,如果會話無論如何都是無效的。

您可以將其添加到過濾器或偵聽器中,然後在您的web.xml文件中對其進行配置。

1

我處理這個問題的方式是在web.xml中添加一個過濾器,該過濾器只映射到您要跟蹤的URL。該過濾器檢查會話是否過期,然後轉發到登錄頁面(如果有的話)。它應該在任何JSF代碼運行之前運行過濾器。

2

Richfaces有自己的處理ViewExpiredException的機制,請看Richfaces docs

+0

但似乎只適用於阿賈克斯請求 – Inv3r53 2010-02-18 10:32:53

1

我過去處理這個問題的方式是使用一個監聽器來檢查受管會話bean中的字段。如果用戶會話超時,監聽程序會清除mbean並將用戶標記爲未登錄。每個請求都通過偵聽器發送,如果未滿足要求,則用戶將被迫離開該站點。我從未在我的日誌中看到ViewExpiredException。發生此異常的唯一時間是服務器已重新啓動並且用戶在上一次活動會話時請求頁面。