14

我们在生产中使用了 Tomcat 9 Web 服务器。我们面临的问题是,如果 tomcat 收到任何格式错误的 URL,我们希望为我们的应用程序显示自定义错误页面,如下所示

http://网址/|

或者

http://网址/[

我在tomcat应用服务器的web.xml中添加了错误页面标签,如下

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

我们在tomcat的webapps目录中的应用程序ROOT文件夹中有error.html。

每当用户尝试请求任何不存在的网页时,他都会收到正确对应于上述 404 错误代码的错误页面。

真正的问题是当用户在浏览器中输入格式错误的 URL(如http://URL/|)时,tomcat 无法重定向到 error.html 。

Tomcat 显示默认的 400 错误请求错误页面,而不是自定义错误页面。

4

4 回答 4

20

这不是错误,而是配置问题。

Tomcat 9 改进了错误处理,以便将更多错误(尤其是在请求处理开始之前发生的那些错误)传递给标准错误处理机制,而不仅仅是返回错误代码。

在 URI 格式错误的情况下,Tomcat 无法解析 URI,因此 URI 无法映射到 Web 应用程序。因此,Tomcat 无法触发应用程序级别的错误处理,因为它无法识别应用程序。在这种情况下,错误由可以在 server.xml 中配置的ErrorReportValve处理。

ErrorReportValve 的最新(ish)新增功能是能够以与每个 Web 应用程序错误页面配置类似的方式定义每个状态代码和/或异常类型的静态网页(即没有 Servlet 或 JSP,只有 HTML)。

错误报告阀示例:

<Valve className="org.apache.catalina.valves.ErrorReportValve"
        errorCode.400="webapps/ROOT/error400.html"
        errorCode.0="webapps/ROOT/errorOthers.html"
        showReport="false"
        showServerInfo="false" />
于 2019-04-16T07:25:47.243 回答
6

以下是遵循https://stackoverflow.com/a/55702749/2532710的示例配置,以节省其他人的时间。在 Host 标签内的 server.xml 中:

  <Valve className="org.apache.catalina.valves.ErrorReportValve"
        errorCode.400="webapps/ROOT/error400.html"
        errorCode.0="webapps/ROOT/errorOthers.html"
        showReport="false"
        showServerInfo="false" />

将静态 html error400.html ... errorOthers.html 放在 CATALINA_BASE 的 webapps/ROOT 中。

于 2020-03-01T00:24:42.003 回答
1

对于嵌入式 Tomcat:

var tomcat = new org.apache.catalina.startup.Tomcat();

var host = (StandardHost) tomcat.getHost();

var errorReportValve = new org.apache.catalina.valves.ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
errorReportValve.setProperty("errorCode.0", "empty.html");
host.addValve(errorReportValve);

http://tomcat.apache.org/tomcat-9.0-doc/config/valve.html#Error_Report_Valve

https://tomcat.apache.org/tomcat-9.0-doc/api/org/apache/catalina/valves/ErrorReportValve.html

于 2020-01-29T12:30:59.883 回答
0

您可以编写自己的错误页面 https://aspiresoftware.in/blog/catalinatomcat-custom-error-report-valve-to-handle-errors-exceptions/

你必须把你的罐子放在tomcat lib中。

于 2019-10-21T06:56:31.813 回答