tomcat8 url包含|等特殊字符报错400的问题

在Tomcat8及以上版本中,由于更严格的URL字符检查,包含特殊字符如'|'的URL会导致400错误。本文介绍了三种解决方案:降低Tomcat版本、修改server.xml,以及创建自定义错误报告阀以隐藏详细错误信息和服务器版本。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在做javaweb项目时,关于统一错误页面在开发的过程中就做过编码,并且一直都很有效,像500,404,403等常规错误码都能得到有效处理,但是400却不行,而且还暴露tomcat的版本信息,这是很严重的安全漏洞
解决方法百度和测试很多,总结如下:

问题产生:
根据rfc规范,url中不允许有 |,{,}等特殊字符,但在实际生产中还是有些url有可能携带有这些字符,特别是|还是较为常见的。在tomcat升级到7以后,对url字符的检查都变严格了,如果出现这类字符,服务器tomcat将直接返回400状态码。

方法一:降低tomcat的版本
开发人员增加一项设置,允许配置在url可以出现的特殊字符,但也仅限于|,{,}三种,见:http://tomcat.apache.org/tomcat-8.0-doc/config/systemprops.html#Other

该项设置在以下版本的tomcat中有效:

- 8.5.x for 8.5.12 onwards

- 8.0.x for 8.0.42 onwards

- 7.0.x for 7.0.76 onwards
- 这个只是允许出现一些特殊字符,并没有说是全部特殊字符。

好像是tomcat7.9以上的版本,都不支持请求链接上带有特殊字符.否则会报400错误,
tomcat请求中包含特殊字符 [] | {} 发送get请求失败:
原因:
这是因为Tomcat严格按照 RFC 3986规范进行访问解析,而 RFC 3986规范定义了Url中只允许包含英文字母(a-zA-Z)、数字(0-9)、-_.~4个特殊字符以及所有保留字符(RFC3986中指定了以下字符为保留字符:! * ’ ( ) ; : @ & = + $ , / ? # [ ])。传入的参数中有"[]"、""不在RFC3986中的保留字段中,所以会报这个错。

方法二:修改server.xml

<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" relaxedQueryChars="[]|{}^&#x5c;&#x60;&quot;&lt;&gt;" redirectPort="8443" />

方法三:修改server.xml(推荐方法)
在Host里加入:

<Valve className="org.apache.catalina.valves.ErrorReportValve"  showReport="false" showServerInfo="false" />

方法三 修改后只会显示出HTTP 400 错误,不会打印堆栈和tomcat版本号信息

关于方法三的解释:

HTTP状态代码提供有关请求的HTTP请求成功完成的信息。HTTP响应分为五个类,如下所示:

信息回应
成功的回应
重新导向
客户错误
服务器错误
在这里,我们的目的是使用HTTP响应代码处理HTTP请求时生成的错误/异常。您可以从HTTP状态代码信息中找到有关HTTP状态代码的更多详细信息。

该错误报告阀是一个错误处理程序,其处理错误状态代码与错误状态码或异常和服务器信息的信息错误页上相应地重定向用户。

该错误报告阀用于与Tomcat服务器编写自定义的错误报告处理功能。

在这里,我们将在Catalina(Tomcat)中创建自定义错误报告阀。错误报告阀用于报告错误/异常。因此,如果发生任何错误(例如404,400等),它将处理该错误并为我们提供默认的tomcat页面,如下所示(400错误请求的示例)。
在这里插入图片描述

在此上方,它将为您提供状态报告信息(HTTP状态)和服务器信息。因此,您可以在Tomcat服务器的conf 中使用server.xml对其进行配置。

默认的Catalina错误报告阀门和配置:org.apache.catalina.valves.ErrorReportValve

属性描述
showReport如果发生错误,用于在错误页面上显示错误信息(状态代码及其信息)的标志。默认值是true
showServerInfo如果发生任何错误,则用于在错误页面上显示当前服务器信息的标志。默认值是true

现在,添加/更新以下内容以在 中的server.xml中进行配置。

<Valve className="org.apache.catalina.valves.ErrorReportValve" showReport="false" showServerInfo="false" />

现在,使用上述配置,您将发现以下内容。(仅HTTP状态代码)。

在这里插入图片描述

注意:同时禁用showServerInfo和showReport只会返回HTTP状态代码,并从默认响应中删除所有CSS。

参考地址:https://aspiresoftware.in/blog/catalinatomcat-custom-error-report-valve-to-handle-errors-exceptions/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值