我正在尝试使用 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;
}
}
}