最近在公司运行项目调用其他工程接口时TOMCAT7 报出这样的一个错误
further occurrences of HTTP header parsing errors will be logged at DEBUG level.
java.lang.IllegalArgumentException: Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC3986
请求接口类型:GET 方式
请求接口路径:localhost:8080/xxx.do?action=queryXXX&list=[{...}]
运行环境:Tomcat7
在网上查了很久的资料归纳以下解决方法和原因
原因1:可能是请求路径过长导致
具体每个浏览器的请求长度可以参考这篇文章:《url get与post 请求长度限制》
解决方法:GET请求改为POST请求
原因2:路径中含有非法字符
如果你的console报错中含有标 红色 部分的错误 并且TOMCAT版本是6以上 就需要注意该项,红色部分意思是 “请求字符不是RFC7230 - RFC3986 的有效字符” 。
tomcat对URL做出了更严格的限制RFC3986文档规定,Url中只允许包含英文字母(a-zA-Z)、数字(0-9)、-_.~4个特殊字符以及所有保留字符。RFC3986中指定了以下字符为保留字符:“!*'();:@&=+$,/?#[]”。还有一些字符,当他们直接放在Url中的时候,可能会引起解析程序的歧义。这些字符被视为不安全字符,原因有很多。
解决方法 1:官方文档解决方案是 《https://tomcat.apache.org/tomcat-7.0-doc/config/systemprops.html》 这篇文章底部给出解决方案:
配置tomcat的catalina.properties 将 tomcat.util.http.parser.HttpParser. requestTargetAllow 属性 设置为 tomcat.util.http.parser.HttpParser. requestTargetAllow = |{}
解决方法2:将参数进行编码 "localhost:8080/xxx.do?action=queryXXX&" + encodeURIComponent(list=[{...}])
解决方法3:换成更低版本的Tomcat 如Tomcat6,Tomcat8.0.3以下
原因3:未知原因
解决方法1:修改Tomcat的server.xml, 在<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />的配置中增加maxHttpHeaderSize的配置
解决方法2:修改端口号
解决方法3:https 改为http 或者 http 改为 https
解决方法4:更换其他版本tomcat