Servlet过滤器 - 实现会话超时

时间:2013-07-22 15:13:23

标签: servlets

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

0 个答案:

没有答案