admin管理员组

文章数量:1608830

最近在公司运行项目调用其他工程接口时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/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

 

本文标签: headerparsingoccurrenceshttpErrors