如何在 web.xml 中指定默认错误页面?

Posted

技术标签:

【中文标题】如何在 web.xml 中指定默认错误页面?【英文标题】:How to specify the default error page in web.xml? 【发布时间】:2011-10-27 07:53:07 【问题描述】:

我在 web.xml 中使用<error-page> 元素来指定当用户遇到特定错误(例如代码为 404 的错误)时的友好错误页面:

<error-page>
        <error-code>404</error-code>
        <location>/Error404.html</location>
</error-page>

但是,我希望如果用户没有遇到&lt;error-page&gt; 中指定的任何错误代码,他或她应该会看到默认错误页面。如何使用 web.xml 中的元素来做到这一点?

【问题讨论】:

您正在使用/定位什么 servlet 容器以及您的 web.xml 声明的 servlet 版本是什么?只有从 Servlet 3.0 开始才有一种简单的方法。 我使用的是 Tomcat 6,servlet 2.5 【参考方案1】:

在 Servlet 3.0 或更高版本上,您只需指定

<web-app ...>
    <error-page>
        <location>/general-error.html</location>
    </error-page>
</web-app>

但由于您仍在使用 Servlet 2.5,除了单独指定每个常见的 HTTP 错误之外别无他法。您需要弄清楚最终用户可能面临哪些 HTTP 错误。在准系统 web 应用程序上,例如使用 HTTP 身份验证、禁用目录列表、使用自定义 servlet 和可能引发未处理异常或未实现所有方法的代码,然后您希望将其设置为 HTTP 错误 401 , 403, 500 和 503。

<error-page>
    <!-- Missing login -->
    <error-code>401</error-code>
    <location>/general-error.html</location>
</error-page>
<error-page>
    <!-- Forbidden directory listing -->
    <error-code>403</error-code>
    <location>/general-error.html</location>
</error-page>
<error-page>
    <!-- Missing resource -->
    <error-code>404</error-code>
    <location>/Error404.html</location>
</error-page>
<error-page>
    <!-- Uncaught exception -->
    <error-code>500</error-code>
    <location>/general-error.html</location>
</error-page>
<error-page>
    <!-- Unsupported servlet method -->
    <error-code>503</error-code>
    <location>/general-error.html</location>
</error-page>

这应该涵盖最常见的。

【讨论】:

你能指定一个一般错误页面,然后用&lt;error-code&gt;标签覆盖某些错误代码吗? @Tomas:Tomcat 的家伙和你有同样的问题。这在规范中没有字面提及,只有规范中的图 14-10 和 web.xml XSD 文件证明 &lt;error-code&gt;&lt;exception-type&gt; 成为可选而不是必需的。见issue 52135。 java.sun.com/xml/ns/javaee/web-app_2_5.xsd 没有为 元素指定 子元素,因此将上述代码按原样粘贴到 Servlet 2.5 web.xml 中会导致 XSD 验证错误。不过,如果我评论它们,它会很好用,谢谢! @BalusC:general-error.html 页面(在您的回答中提到)应该放在 WEB-INF 内的什么位置?我对 servlet 2.5 有一个奇怪的问题,其中对于 HTTP 错误 403,我创建了一个 定义,并且 error403.jsp 页面位于 WEB-INF 内部,因此 error403.jsp 页面在任何时候加载的资源被尝试访问,但 error403.jsp 中的图像和 css 未加载,导致页面看起来放错了位置。 @Kaipa:只需使用 URL 相对路径而不是 CSS/JS/图像资源的 webcontent 相对路径。许多初学者错误地认为这些资源是在服务器端解析的,但它们实际上是在客户端解析的。另见***.com/questions/3655316/…【参考方案2】:

你也可以这样做:

<error-page>
    <error-code>403</error-code>
    <location>/403.html</location>
</error-page>

<error-page>
    <location>/error.html</location>
</error-page>

对于错误代码 403,它将返回页面 403.html,对于任何其他错误代码,它将返回页面 error.html。

【讨论】:

【参考方案3】:

您还可以使用&lt;exception-type&gt; 为异常指定&lt;error-page&gt;,例如:

<error-page>
    <exception-type>java.lang.Exception</exception-type>
    <location>/errorpages/exception.html</location>
</error-page>

或者使用&lt;error-code&gt;映射错误代码:

<error-page>
    <error-code>404</error-code>
    <location>/errorpages/404error.html</location>
</error-page>

【讨论】:

以上是关于如何在 web.xml 中指定默认错误页面?的主要内容,如果未能解决你的问题,请参考以下文章

如何删除PDF文档中指定的一页文件?

servlet 过滤器是不是必须在 web.xml 文件中指定?

如何在 qsub 中指定错误日志文件和输出文件

Tomcat更改错误页面指向,改变404,500错误页面

如何重写此 MySQL 查询,使其不会引发此错误:您无法在 FROM 子句中指定目标表 'crawlLog' 进行更新?

在 Xcode 中,如何在我的项目设置中指定正确的库以避免链接错误?