ロギングの目的で、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をキャッチできますか?
前もって感謝します。