由错误页面处理的ViewExpiredException仍在日志中

时间:2013-04-20 10:15:15

标签: java jsf jsf-2 glassfish-3

当会话过期时,JSF应用程序可以抛出ViewExpiredException个。在您的系统上安排访客时,此事件将非常常见。因此,应用程序将毫不费力地处理此事件,如下所示:

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

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

我该如何做到这一点?

1 个答案:

答案 0 :(得分:8)

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

如果错误页面确实为您完成了工作(这对于JSF ajax请求不起作用,除非您有自定义JSF ExceptionHandler),那么映射到匹配JSF的URL模式的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异常处理程序。转到以下相关答案,看一些具体的例子: