0

ロギングの目的で、JSFアプリケーションでセッションタイムアウトが発生したときを検出することに関心があります。

ユーザーがログインしていて、セッションがすでにアクティブになっているかどうかを確認する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属性にnullを割り当てます。この時点では、ユーザーが以前にログインしたことがないのか、タイムアウトによって切断されたのかを区別できません。

私は、ViewExpiredException例外を検出し、ビューを特定のページにリダイレクトするためにerrorPagesを使用できることを読みました。しかし、ソースコードでこの例外を管理できるかどうかはわかりません。

私の質問は、セッションタイムアウトを処理するために、PhaseListener実装内でこのViewExpiredExceptionをキャッチできますか?

前もって感謝します。

4

1 に答える 1

1

私は JSF プロジェクトで同じシナリオに直面しました。解決策は、フィルターを使用してセッションの期限切れをキャッチすることでした。BalusC (JSF Expert) がこの問題を説明し、良い例を示しています。

session.invalidate()さらに、ログアウト メソッドとセッション タイムアウト ハンドラを追加することを忘れないでください。

于 2012-07-26T14:10:45.970 に答える