2013-04-20 28 views
6

当会话过期时,JSF应用程序可能会抛出ViewExpiredException。当您的系统上有客人时,此事件将非常常见。为此,应用程序将处理这个事件,而不对客人有任何问题,具体如下:ViewExpiredException由错误页面处理,仍在日志中

<error-page> 
    <exception-type>javax.faces.application.ViewExpiredException</exception-type> 
    <location>/expired</location> 
</error-page> 

当客人试图在一个过期的会话发送一个请求,他将被重定向到/expired。由于我不认为这个Exception是值得一提的问题,所以我想阻止将stacktrace写入我的应用程序服务器的日志。

我该如何做到这一点?

回答

7

基本上有两个选项可以归结为相同的解决方案:使用servlet filter或JSF exception handler自己捕捉,压缩并导航到错误页面。这样,异常将不会到达servletcontainer,然后它会自动处理并记录它。

假设错误页面确实为您完成了工作(这不适用于JSF ajax请求,除非您有自定义JSF ExceptionHandler),那么映射到URL模式匹配JSF请求的servlet过滤器在其doFilter()方法以下就足够了:

try { 
    chain.doFilter(request, response); 
} catch (ServletException e) { 
    if (e.getRootCause() instanceof ViewExpiredException) { 
     request.getRequestDispatcher("/expired").forward(request, response); 
    } else { 
     throw e; 
    } 
} 

如果你想覆盖JSF Ajax请求为好,那么你就不能围绕一个JSF异常处理程序去。头以下的相关答案,看看一些具体的例子: