【问题标题】:Does javax.servlet.error.exception attribute always cast to java.lang.Exception type?javax.servlet.error.exception 属性是否总是转换为 java.lang.Exception 类型?
【发布时间】:2016-01-04 20:36:56
【问题描述】:

dispatcher 类型为ERROR 的请求中的属性javax.servlet.error.exception 总是可以转换为java.lang.Exception 类型吗?

我看了一下the javadoc,但没有提到类型必须是java.lang.Exception OR java.lang.Throwable

我问这个问题是因为我正在处理错误页面。如果属性javax.servlet.error.exception 始终保持Exception 类型,那么我可以编写如下代码,而无需担心所有情况下的ClassCastException

Exception exception = (Exception) request.getAttribute("javax.servlet.error.exception");

我当然可以这样做:

Throwable error = (Throwable)request.getAttribute("javax.servlet.error.exception");

但我的处理方式是 Exception 类型(不是 Throwable)。

谢谢!

【问题讨论】:

  • 我不确定你在问什么。您提供的链接中的 ERROR_EXCEPTION_TYPE 类型为 String
  • 谢谢!我输入了错误的属性名称。我修好了。
  • 经过您的编辑,我仍然觉得这个问题有些误导:“javax.servlet.error.exception”是RequestDispatcher.ERROR_EXCEPTION 的常量值。但是您主要关心的显然是方法ServletRequest.getAttribute(String) 的行为。这就是web.xml 和/或ServletRequest.setAttribute(String, Object) 发挥作用的地方。
  • @Würgspaß: 但是 servlet 容器会在容器执行 ERROR dispatch 时自动设置异常信息
  • 没错。无论如何,在自定义服务器代码中也可能会调用setAttribute。甚至将来有人会更改web.xml 中的设置。所以,为了安全起见,我会准备我的代码......无论如何,问题都与getAttribute / setAttribute有关,真的。这就是我的观点。

标签: java servlets exception-handling requestdispatcher


【解决方案1】:

但我的目标是例外

您可以使用ERROR_EXCEPTION_TYPE 找出类型,然后使用ERROR_EXCEPTION 检索对象

String excType = request.getAttribute(RequestDispatcher.ERROR_EXCEPTION_TYPE);
if ("java.lang.Exception".equals(excType)) {
   Exception exception = (Exception) request.getAttribute(RequestDispatcher.ERROR_EXCEPTION);
   //....
}

这仍然可能引发ClassCastException,但是,如果ServletRequest.setAttribute() 被用于恶作剧的方式,例如。

如果您也关心其他类型,您可以使用switch 或反射。

【讨论】:

    【解决方案2】:

    这取决于与web.xml 中的<error-page> 条目关联的<exception-type>,其<location> 引用了相关的基于JSP/Servlet 的资源。

    如果没有,即你使用general error page 没有任何<exception-type>,或者你只使用<error-code>500</error-code>,或者你根本没有任何<error-page>,那么假设java.lang.Throwable .

    如果有显式的<exception-type>,则假定完全是在web.xml 中注册的类型。

    换一种说法,如果您只想假设java.lang.Exception,则根据该类型设置<exception-type>

    <error-page>
        <exception-type>java.lang.Exception</exception-type>
        <location>/your-error-resource</location>
    </error-page>
    

    请注意,当您没有500java.lang.Throwable&lt;error-page&gt; 时,任何java.lang.Error(即匹配java.lang.Throwable)都会滑过并最终进入服务器的默认错误页面。

    另见:

    【讨论】:

      猜你喜欢
      • 2011-05-15
      • 2011-07-10
      • 1970-01-01
      • 2014-03-09
      • 1970-01-01
      • 2017-12-04
      • 2017-10-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多