首先出现这个问题是原因高版本的tomcat会严格按照对RFC 3986规范进行访问解析。
RFC 3986规范定义了Url中只允许包含英文字母(a-zA-Z)、数字(0-9)、-_.~4种特殊字符以及所有保留字符(RFC3986中指定了以下字符为保留字符:! * ’ ( ) ; : @ & = + $ , / ? # [ ])。而我们的系统在通过地址传参时,在url中传了一段参数包含有有不在RFC3986中的保留字段中,所以会报这个错。
几种解决方法:(这里就不推荐需要去改程序的做法了,从根源上解决才能高枕无忧)
1.换低版本的tomcat (tomcat 7.0.76之前的版本不会出现这个问题)
但是换低版本只是缓兵之计,肯定要从源头上来解决。
2.修改tomcat目录底下的/conf/catalina.properties配置文件,此方法不适用所有版本,可以用下面这个方法来鉴别:
如果catalina.properties中存在着下面这句话,没有就不用尝试了,说明这个版本的tomcat不支持。
#tomcat.util.http.parser.HttpParser.requestTargetAllow=|
如果存在上面这句话就可以尝试去除#来开启该配置,可以在后面添加URL中可能会出现的非保留字段(就是你觉得你的URL中可能存在哪种特殊字符,填进去就完事了)
tomcat.util.http.parser.HttpParser.requestTargetAllow=|{}-
但是上面这种做法应该在tomcat7.0.76、tomcat8.0.42、tomcat8.5.12之后这些版本才支持。tomcat9.022版本不支持(亲测)。
tomcat 6.0.41
tomcat 7.0.73:
tomcat 7.0.78 :
tomcat 8.0.30:
tomcat 8.0.53 :
tomcat 9.0.11 :
3.能看到第三个方法估计就是第二个方法不管用了
tomcat目录底下/conf/server.xml
往Connector中添加relaxedQueryChars和relaxedPathChars,直接复制下面的relaxedQueryChars和relaxedPathChars即可。
<Connector port="xxx" relaxedQueryChars="[]|{}-^`"<>"relaxedPathChars="[]|{}-^`"<>"/>
注:其中的` " < > 分别代表 \ ` < > 四种符号
第三种方法用tomcat9.0.22 、9.0.11 版本亲测是成功的。
我的tomcat 配置:
总结:
1.tomcat 7.0.62版本之前对RFC 3986规范不严格所以不会出现这个错误。
2.tomcat7.0.76、tomcat8.0.42、tomcat8.5.12之后的子版本可以尝试修改catalina.properties来解决这个问题。
3.tomcat9的版本就使用修改server.xml来解决这个问题。
4.在网上看到有人分享,说IE浏览器才会出现这个问题。但是我用谷歌之类的浏览器也是会出现的。
原文链接