Servlets Servlet筛选器-实现会话超时

Servlets Servlet筛选器-实现会话超时,servlets,Servlets,我试图使用servlet过滤器来实现捕获会话超时错误,该错误在web应用程序中运行的任何JSF应用程序中都没有被捕获。代码相当简单(见下文)。当过滤器捕获ServletException时,它会检查它是否是RuntimeException。如果是,则检查会话是否已过期。如果是这样,它将错误视为超时错误,并将请求转发到/errorpage_viewexpired.jsp。这段代码在我的本地pc上运行得非常好。但当它在我们的QA框中运行时,用户有时会访问/errorpage_viewexpired.

我试图使用servlet过滤器来实现捕获会话超时错误,该错误在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;
       }
    }
}

在jsf中,您应该更喜欢拦截器。我遇到的另一个问题是,当会话超时时,我没有得到ViewExpiredException。在SystemOut.log中,我将得到如下内容:com.ibm.ws.webcontainer.servlet.ServletWrapper服务SRVE0068E:应用程序[MyAccount]中servlet[/addDevices.jsp]的一个服务方法引发了异常。创建的异常:[javax.faces.el.EvaluationException:无法获取表达式“#{AddDeviceBean.orderBean.packageSummaryTable}”的值。我不确定这是因为我使用的是t:saveState还是什么。我更希望能够检查viewExpiredException。jsf拦截器中是否有方法检查这一点?