0

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

0 回答 0