gpt4 book ai didi

jsf - Web.xml 中的 java.lang.Throwable 错误页面中显示的 ViewExpiredException

转载 作者:行者123 更新时间:2023-12-03 14:12:04 25 4
gpt4 key购买 nike

我正在开发一个 JSF Web 应用程序,如果 View 过期,我需要在其中显示一个“ session 过期”页面,但对于所有其他人来说,我需要一个一般技术错误页面。当我触发异常时,应用程序只会进入技术错误页面。这是错误页面定义:

<error-page> 
<exception-type>javax.faces.application.ViewExpiredException</exception-type>
<location>/jsps/utility/sessionExpired.jsp</location>
</error-page>
<error-page>
<exception-type>java.lang.Throwable</exception-type>
<location>/jsps/utility/technicalError.jsp</location>
</error-page>
<error-page>
<error-code>500</error-code>
<location>/jsps/utility/technicalError.jsp</location>
</error-page>

我删除了 TechnicalError.jsp 错误页面元素,它工作正常,但是当我把它们放回去时,我无法进入 sessionExpired.jsp 页面。我如何告诉 Web 容器评估这些标签的顺序,以便出现正确的页面?谢谢。

最佳答案

这是因为 ViewExpiredException 被包裹在 ServletException 根据 JSF 规范。这是 JSF 1.2 specification 的第 10.2.6.2 章的摘录:

10.2.6.2 FacesServlet

Call the execute() method of the saved Lifecycle instance, passing the FacesContext instance for this request as a parameter. If the execute() method throws a FacesException, re-throw it as a ServletException with the FacesException as the root cause.



Servlet API 规范中指定了如何分配错误页面。这是 Servlet API specification 2.5 的第9.9.2 章的摘录:

SRV.9.9.2 Error Pages

If no error-page declaration containing an exception-type fits using the class-hierarchy match, and the exception thrown is a ServletException or subclass thereof, the container extracts the wrapped exception, as defined by the ServletException.getRootCause method. A second pass is made over the error page declarations, again attempting the match against the error page declarations, but using the wrapped exception instead.



在类层次结构中, ServletException已匹配 Throwable ,因此不会为第二遍提取其根本原因。

要证明此指定行为,请替换 javax.faces.application.ViewExpiredException通过 javax.servlet.ServletException<exception-type>并重试。您将看到正在显示的预期错误页面。

要解决这个问题,只需 删除 java.lang.Throwable 上的错误页面或 java.lang.Exception .如果没有一个异常特定的错误页面匹配,那么它将回退到错误代码 500 的错误页面。反正。所以,你只需要这样:
<error-page> 
<exception-type>javax.faces.application.ViewExpiredException</exception-type>
<location>/jsps/utility/sessionExpired.jsp</location>
</error-page>
<error-page>
<error-code>500</error-code>
<location>/jsps/utility/technicalError.jsp</location>
</error-page>

更新 :根据 OP 的(已删除)评论:要可靠地测试这一点,您不能执行 throw new ViewExpiredException()在 bean 构造函数或方法中。反过来,它会被包裹在一些 EL 异常中。您最终可以添加调试行打印 rootCauseFilter亲眼看看。

如果您使用的是 Eclipse/Tomcat,一个快速的测试方法 ViewExpiredException如下:
  • 使用简单的命令按钮创建一个 JSF 页面,部署并运行它并在 webbrowser 中打开它。
  • 返回 Eclipse,右键单击 Tomcat 服务器并选择 Clean Tomcat Work Directory。这将重新启动 Tomcat 丢弃所有序列化 session (重要!仅重新启动 Tomcat 是不够的)。
  • 返回网络浏览器并按下命令按钮(无需事先重新加载页面!)。
  • 关于jsf - Web.xml 中的 java.lang.Throwable 错误页面中显示的 ViewExpiredException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3206922/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com