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

Men*_*nno 7 java jsf jsf-2 glassfish-3

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

<error-page>
    <exception-type>javax.faces.application.ViewExpiredException</exception-type>
    <location>/expired</location>
</error-page>
Run Code Online (Sandbox Code Playgroud)

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

我怎么能做到这一点?

Bal*_*usC 8

基本上有两个选项可以归结为相同的解决方案:使用servlet过滤器或JSF 异常处理程序自己捕获,抑制和导航到错误页面.这样,异常将无法到达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;
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您还想覆盖JSF ajax请求,那么您就无法绕过JSF异常处理程序.转到以下相关答案,看看一些具体的例子: