首页 > 解决方案 > 我需要它将多个站点重定向到同一个错误页面

问题描述

我有一个运行在 Tomcat 上的应用程序运行良好。当我调用http://example.com:18080/app它工作正常。现在我创建简单的错误页面以在出现错误时重定向:

<html>
<head> 
<title>Error Page</title>
</head>
<body> That's an error! </body>
</html>

我将它添加到我的 web.xml

<error-page>
    <error-code>404</error-code>
    <location>/error.jsp</location>
</error-page>

当我调用http://example.com:18080/app/blabla时,它会转到我的错误页面,但是当我调用http://example.com:18080/blabla或只是http://example.com:18080我需要它重定向到相同的错误页面。

有人知道怎么做吗?

谢谢

法比奥

标签: tomcat

解决方案


Servlet 规范要求错误页面位于 Web 应用程序的内部(参见错误页面)。所以你可以:

  • 向所有应用程序添加相同的错误页面,
  • 使用容器特定的机制而不是错误页面。

在 Tomcat 中ErrorReportValve(参见文档)负责打印应用程序自定义的错误消息。如果您的错误消息是一个简单的 HTML(例如“404.html”),您可以将其保存在任意位置(例如$CATALINA_BASE/errors)并显式添加ErrorReportValveserver.xml

<Host>
  ...
  <Valve
    className="org.apache.catalina.valves.ErrorReportValve"
    showServerInfo="false"
    errorCode.404="errors/404.html"/>
</Host>

但是,如果您想使用 JSP 或 servlet 来格式化错误页面,您需要:

  1. 通过将以下内容添加到以下内容,将元素添加<error-page>到所有应用程序$CATALINA_BASE/conf/web.xml
<error-page>
  <error-code>404</error-code>
  <location>/WEB-INF/errors/404.jsp</location>
</error-page>
  1. 在所有应用程序中挂载$CATALINA_BASE/errors文件夹。WEB-INF/errors这可以通过将以下内容添加到 中的<Context>元素来完成$CATALINA_BASE/conf/context.xml
<Context>
  ...
  <Resources
    className="org.apache.catalina.webresources.StandardRoot">
    <PostResources
      className="org.apache.catalina.webresources.DirResourceSet"
      base="${catalina.base}/errors"
      webAppMount="/WEB-INF/errors"/>
  </Resources>
</Context>

推荐阅读