爲了記錄目的,我有興趣檢測何時在我的JSF應用程序中發生會話超時。是否有可能在PhaseListener中捕獲ViewExpriedException?
我已經實現了一個PhaseListener來檢查用戶是否已經登錄並且他們的會話已經激活。我afterPhase方法的實現是:
VAR url_accepted(代碼中使用)中包含的用戶應該以提供一個登錄表單訪問公共頁面的列表。
public void afterPhase(PhaseEvent event) { FacesContext context = event.getFacesContext(); HttpSession session = (HttpSession) context.getExternalContext().getSession(true); AuthenticationBean sessionBean = (AuthenticationBean) session.getAttribute("sessionBean"); String url_req = context.getViewRoot().getViewId(); //1. Check if user has a session and is logged in: if(((sessionBean == null) || (sessionBean != null && !sessionBean.isLoggedIn())) && !url_accepted.contains(url_req)){ context.getApplication().getNavigationHandler().handleNavigation(context,null,"auth_error"); return; } //2. Code continues in order to check if a logged user has permissions to access the requested page(not relevant): }
當用戶已被斷開由於會話超時,則PhaseListener在不能從的ExternalContext找回我一個sessionBean和空分配給一個sessionBean屬性。在這一點上,我無法分辨用戶之前是否已經登錄過,或者由於超時而斷開連接。
我讀過,人們可以爲了檢測ViewExpiredException異常並重定向視圖到指定頁面使用errorPages。但我不知道是否有可能在我的源代碼中管理這個異常。
我的問題是:我可以在我的PhaseListener實現中捕獲這個ViewExpiredException以處理會話超時?
在此先感謝。
感謝您的參考和建議。我會看看我是否可以在我的項目中調整這個BalusC解決方案。 – jmrodrigg 2012-07-27 11:14:11
如果您有任何問題,只需更新您的文章並在此留言,以便我可以幫助您。 – 2012-07-27 15:05:31
我一直在分析BalusC提出的例子,但是我沒有得到他管理超時註銷的地方。我認爲他沒有采取任何行動。 我在應用程序中遇到的問題已經適用於會話超時,但我需要趕上它的發生時間,以便我可以記錄哪個用戶因此而斷開連接。 讓我知道它是否已經在BalusC代碼中實現,我將更詳細地介紹代碼。 – jmrodrigg 2012-07-31 12:43:55