7

JSF 应用程序可以ViewExpiredException在会话过期时抛出 s。当您的系统上有客人时,此事件将很常见。因此,应用程序将处理此事件而不会为客人带来任何麻烦,如下所示:

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

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

我怎样才能做到这一点?

4

1 回答 1

7

基本上有 2 个选项,每个选项都归结为相同的解决方案:使用servlet 过滤器或 JSF异常处理程序自行捕获、抑制和导航到错误页面。这样异常就不会到达 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 异常处理程序。前往以下相关答案以查看一些具体示例:

于 2013-04-20T18:00:50.933 回答