2012-07-26 62 views
0

爲了記錄目的,我有興趣檢測何時在我的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以處理會話超時?

在此先感謝。

回答

1

我在JSF項目中遇到了同樣的情況。解決方案是使用Filter來捕獲會話過期。 BalusC(JSF專家)解釋了這一問題,並表示一個很好的例子:

另外,不要忘了在你的註銷方法和會話超時處理程序添加session.invalidate()

+0

感謝您的參考和建議。我會看看我是否可以在我的項目中調整這個BalusC解決方案。 – jmrodrigg 2012-07-27 11:14:11

+0

如果您有任何問題,只需更新您的文章並在此留言,以便我可以幫助您。 – 2012-07-27 15:05:31

+0

我一直在分析BalusC提出的例子,但是我沒有得到他管理超時註銷的地方。我認爲他沒有采取任何行動。 我在應用程序中遇到的問題已經適用於會話超時,但我需要趕上它的發生時間,以便我可以記錄哪個用戶因此而斷開連接。 讓我知道它是否已經在BalusC代碼中實現,我將更詳細地介紹代碼。 – jmrodrigg 2012-07-31 12:43:55

相關問題