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

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

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

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

我该怎么做?

参考方案

基本上有2个选项,每个选项都可以归结为相同的解决方案:自己使用servlet filter或JSF exception handler捕获,抑制和导航到错误页面。这样,异常不会到达servlet容器,该servlet容器随后将自动处理并记录它。

假设错误页面确实为您完成了工作(也就是说,除非您有自定义的JSF ExceptionHandler,否则它不适用于JSF ajax请求),然后在与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异常处理程序。前往以下相关答案以查看一些具体示例:

  • Why use a JSF ExceptionHandlerFactory instead of <error-page> redirection?
  • Check if session exists JSF
  • JSF:清除会话范围的Bean - java

    我想知道,在用户关闭JSF 1.2上的窗口(点击浏览器的“ X”)后,如何在JSF中执行session.remove("userBean")。我当时想在用户点击浏览器的“ X”后弹出一个确认消息,但我不太确定如何访问Ok按钮或将其绑定到我定义的方法上,在这里我有逻辑来清除作用域中的bean。还是有更好的方法呢?任何帮助将不胜感激。谢谢。 …

    Java:线程池如何将线程映射到可运行对象 - java

    试图绕过Java并发问题,并且很难理解线程池,线程以及它们正在执行的可运行“任务”之间的关系。如果我创建一个有10个线程的线程池,那么我是否必须将相同的任务传递给池中的每个线程,或者池化的线程实际上只是与任务无关的“工人无人机”可用于执行任何任务?无论哪种方式,Executor / ExecutorService如何将正确的任务分配给正确的线程? 参考方案 …

    JAVA:字节码和二进制有什么区别? - java

    java字节代码(已编译的语言,也称为目标代码)与机器代码(当前计算机的本机代码)之间有什么区别?我读过一些书,他们将字节码称为二进制指令,但我不知道为什么。 参考方案 字节码是独立于平台的,在Windows中运行的编译器编译的字节码仍将在linux / unix / mac中运行。机器代码是特定于平台的,如果在Windows x86中编译,则它将仅在Win…

    java:继承 - java

    有哪些替代继承的方法? java大神给出的解决方案 有效的Java:偏重于继承而不是继承。 (这实际上也来自“四人帮”)。他提出的理由是,如果扩展类未明确设计为继承,则继承会引起很多不正常的副作用。例如,对super.someMethod()的任何调用都可以引导您通过未知代码的意外路径。取而代之的是,持有对本来应该扩展的类的引用,然后委托给它。这是与Eric…

    Java:BigInteger,如何通过OutputStream编写它 - java

    我想将BigInteger写入文件。做这个的最好方式是什么。当然,我想从输入流中读取(使用程序,而不是人工)。我必须使用ObjectOutputStream还是有更好的方法?目的是使用尽可能少的字节。谢谢马丁 参考方案 Java序列化(ObjectOutputStream / ObjectInputStream)是将对象序列化为八位字节序列的一种通用方法。但…