Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC

报错如下:(浏览器页面的和控制台的)

 

 

原因分析:

翻译过来就是:在请求目标中发现无效字符。有效字符在RFC 7230和RFC 3986中定义。

百度看看:原来这是从7.0开始的高版本tomcat中的新特性:就是严格按照 RFC 3986规范进行访问解析,而 RFC 3986规范定义了Url中只允许包含英文字母(a-zA-Z)、数字(0-9)、-_.~4个特殊字符以及所有保留字符(RFC3986中指定了以下字符为保留字符:! * ’ ( ) ; : @ & = + $ , / ? # [ ])。

查看Tomcat官方文档:

Add additional checks for valid characters to the HTTP request line parsing so invalid request lines are rejected sooner。翻译过来就是:为HTTP请求行分析添加有效字符的附加检查,以便更快拒绝无效的请求行。

文档地址:http://tomcat.apache.org/tomcat-7.0-doc/changelog.html

 

解决方案:

既然知道原因了,那我们应该怎么解决这个问题呢?

网上的几种办法:

1、更换低版本的Tomcat。这个办法表面上是可行的,但是这不是属于自欺欺人嘛。因为在实际的项目开发中,你改动Tomcat很可能也要改动JDK版本和其他jar包版本,这会影响到整个项目的正常开发,没理由大家都跟着你改吧。所以pass掉了。

2、在Tomcat的安装目录中,打开conf/catalina.properties,找到末尾的一行。增加两行配置:

tomcat.util.http.parser.HttpParser.requestTargetAllow=|{}
org.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH=true

其中,第一行|后面表示不检查的字符。

但是,运行后还是报错,查看控制台:

证明这几个字符都不允许这样的方式来逃避检查,即requestTargetAllow 只能配置|、{、} 允许这三个字符,对于其他的(例如" < > [ \ ] ^ ` { | } .),在请求时,仍然拦截。所以失败了嗷。

3、在Tomcat的安装目录中,打开conf/server.xml文件,找到<Connector>节点,增加maxHttpHeaderSize="10240"这个属性,maxHttpHeaderSize默认是8*1024的,改为10*1024,用于增加请求头的长度。

保存运行,发现也没什么用。

4、最后,还是得看官方的文档。堵上了一扇门,必会有另外一扇窗。


文档地址:https://tomcat.apache.org/tomcat-8.5-doc/config/systemprops.html

官方提供了relaxedPathChars relaxedQueryChars 这两个属性用于解决这个问题。

那这两个属性怎么用呢?再看:

文档地址:https://tomcat.apache.org/tomcat-8.5-doc/config/http.html

只需在刚刚的<Connector>标签中,加入relaxedPathChars="|{}[],%" 和 relaxedQueryChars="|{}[],%"即可,其中|后面的字符可以自己随意增减。即:

保存运行,大功告成了。

 

思考总结:

1、遇到问题,先自己去看看能不能解决,不能的话再去网上查找资料。

2、官方文档很重要,一般的问题往往都可以在文档里面找到解决办法。

3、多学习学习英文。。。

4、这个搞了很久,最后还是一位大佬的博客解决了问题。十分感谢

链接:https://yq.aliyun.com/articles/641394#

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值