Tomcat未重定向到400错误请求自定义错误页面

bwitn5fc  于 2022-12-23  发布在  其他
关注(0)|答案(4)|浏览(441)

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

[http://URL/
我在tomcat应用服务器的web.xml中添加了error page标签,如下所示

<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目录下的应用程序根文件夹中有error.html。
每当用户试图请求任何不存在的网页时,他接收到正确对应于如上所述的404错误代码的错误页面。
真实的的问题是,当用户在浏览器(如http://URL/|)中输入格式错误的URL时,Tomcat无法重定向到error.html
Tomcat显示默认的400错误请求错误页,而不是自定义错误页。

2vuwiymt

2vuwiymt1#

这不是错误,而是配置问题。
Tomcat 9改进了错误处理,以便将更多的错误(特别是那些在请求处理开始之前发生的错误)传递给标准错误处理机制,而不仅仅是返回错误代码。
如果URI格式不正确,Tomcat将无法解析URI,因此无法将URIMap到Web应用程序。因此,Tomcat无法触发应用程序级错误处理,因为它无法标识应用程序。在这种情况下,错误由ErrorReportValve处理,该错误可以在server.xml中配置。
ErrorReportValve最近增加的一项功能是能够以与每个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" />
qfe3c7zg

qfe3c7zg2#

以下是遵循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错误400.html...错误其他. html放入 Catalina _BASE的webapps/根目录中。

qhhrdooz

qhhrdooz3#

以前的解决方案在我的情况下不起作用。
根据Tomcat文档,阀组件可以放入容器引擎、主机或上下文。尝试了关于此特定错误400的所有方法,但没有成功(而其他错误按预期处理)。
最后我找到了这个谜中缺失的元素:
奇怪的是,为了提高效率,必须将错误报告Valve放在定义为 Catalina 引擎的defaultHost的主机容器中,即使它不是目标主机。
服务器. xml示例:处理错误400对“some-cats.com“和“some-dogs.com“的错误请求

<Engine name="Catalina" defaultHost="www.some-dogs.com">
    <!--     NO EFFECT ON ERROR PAGE 400
    <Valve className="org.apache.catalina.valves.ErrorReportValve" showReport="false" showServerInfo="false" /> 
    -->
    <Host name="www.some-cats.com">      
        <!--     NO EFFECT ON ERROR PAGE 400
        <Valve className="org.apache.catalina.valves.ErrorReportValve" showReport="false" showServerInfo="false" /> 
        -->
        ...
    </Host>
    <Host name="www.some-dogs.com">
        <!--  HERE IS THE RIGHT PLACE FOR ERROR PAGE 400-->
        <Valve className="org.apache.catalina.valves.ErrorReportValve" errorCode.0="path/error.html" showReport="false" showServerInfo="false" />
        ...
    </Host>
</Engine>

在tomcat 8.5.84和9.0.70上进行测试
当然,如果你只有一个主机,你就不会有这个问题。

相关问题