サーブレット フィルターを使用して、Web アプリで実行されている JSF アプリケーション内でキャッチされないセッション タイムアウト エラーのキャッチを実装しようとしています。コードはかなり単純です (以下を参照)。フィルターが ServletException をキャッチすると、それが RuntimeException であるかどうかを確認します。そうである場合は、セッションの有効期限が切れているかどうかを確認します。その場合、エラーをタイムアウト エラーとして扱い、要求を /errorpage_viewexpired.jsp に転送します。このコードは、ローカル PC で完全に機能します。しかし、QA ボックスで実行すると、ユーザーが /errorpage_viewexpired.jsp に移動することがあります。ただし、ほとんどの場合、null という単語が表示された空白の画面が表示されます。私の地元では起こっていないので、私は困惑しています。
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
try {
chain.doFilter(request, response);
}
catch (ServletException e) {
Throwable rootCause = e.getRootCause();
if (rootCause instanceof RuntimeException) { // Catch jsf exception.
if (isSessionExpired(request)) {
RequestDispatcher dispatcher = request.getRequestDispatcher("/errorpage_viewexpired.jsp");
dispatcher.forward(request, response);
}
else {
rootCause.printStackTrace();
RequestDispatcher dispatcher = request.getRequestDispatcher("/errorpage_throwable.jsp?log=N");
dispatcher.forward(request, response);
}
}
else {
throw e;
}
}
}