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

150

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

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

然而,我希望如果用户没有遇到在<error-page>中指定的任何错误代码,他或她应该看到一个默认的错误页面。如何在web.xml中使用<error-page>元素来实现这一点?


2
你使用/针对哪个servlet容器,你的web.xml声明了哪个servlet版本?只有自Servlet 3.0以来才有一种简单的方法。 - BalusC
我正在使用Tomcat 6,servlet 2.5。 - ipkiss
3个回答

253

如果使用Servlet 3.0或更新版本,您只需指定

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

但由于您仍在使用Servlet 2.5,因此除了逐个指定每个常见的HTTP错误之外,没有其他方法。您需要确定最终用户可能面临哪些HTTP错误。在一个典型的基本Web应用程序上,例如使用HTTP身份验证,禁用目录列表,使用自定义Servlet和可能引发未处理异常或未实现所有方法的代码,则希望将其设置为401、403、500和503等HTTP错误。

<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>

这应该涵盖了最常见的情况。


你能指定一个通用的错误页面,然后使用<error-code>标签覆盖特定的错误代码吗? - Qix - MONICA WAS MISTREATED
6
@Tomas:Tomcat的开发人员和你遇到了相同的问题。这在规范中没有明确提到,只有规范中的图14-10和web.xml XSD文件表明<error-code><exception-type>变为可选项而不是必填项。请参见问题52135 - BalusC
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd 在 <error-page> 元素中没有指定 <description> 子元素,因此将以上代码完全复制粘贴到 Servlet 2.5 web.xml 中会导致 XSD 验证错误。不过,如果我加以注释,它就能正常工作,谢谢! - László van den Hoek
1
@BalusC:在您的答案中提到的general-error.html页面应该放在哪里,是在WEB-INF内部吗?我在servlet 2.5中遇到了一个奇怪的问题,即对于HTTP错误403,我创建了一个<error-page>定义,并且error403.jsp页面位于WEB-INF内部,因此当尝试访问任何资源时,error403.jsp页面会加载,但是error403.jsp内部的图像和CSS不会加载,使页面看起来错位。 - Jayy
1
@Kaipa:只需使用URL相对路径而不是Web内容相对路径来引用CSS/JS/图像资源即可。许多初学者错误地认为这些资源是在服务器端解析的,但实际上它们是在客户端解析的。另请参阅https://dev59.com/0HA65IYBdhLWcg3wvhXi - BalusC
显示剩余2条评论

26

您也可以这样做:

<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。


11

您还可以使用<exception-type>指定异常的<error-page>,示例如下:

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

或者使用 <error-code> 映射错误代码:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接