我正在尝试使用servlet过滤器来实现捕获会话超时错误,该错误未在我们的Web应用程序中运行的任何JSF应用程序中捕获。代码非常简单(见下文)。当过滤器捕获到ServletException时,它会检查它是否是RuntimeException。如果是,则检查会话是否已过期。如果是这样,它会将错误视为超时错误,并将请求转发给/errorpage_viewexpired.jsp。此代码在我的本地电脑上完美运行。但是当它在我们的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;
}
}
}