最近个人的一个项目,总是不定时浮现Error parsing HTTP request header这样的问题,有以下两种具体报错
- Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986.
- Invalid character found in method name. HTTP method names must be tokens
可以先看一下这个报错
o.apache.coyote.http11.Http11Processor:Error parsing HTTP request header
Note: further occurrences of HTTP request 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 RFC 3986
目前,可以确定的是,该报错是由于url中有非法字符导致的,解决方法有
- 请求url中别有奇奇怪怪的字符,老老实实不好吗
- 使用tomcat7.0.69以前的版本,这些版本不对请求头进行检验
- 不想降低tomcat版本?那就对特殊字符进行转义,嗯确实有点麻烦
一般这个报错,很容易解决。
再看这个报错
o.apache.coyote.http11.Http11Processor: Error parsing HTTP request header
Note: further occurrences of HTTP request parsing errors will be logged at DEBUG level.
java.lang.IllegalArgumentException: Invalid character found in method name.
HTTP method names must be tokens
这个问题,网上众说纷纭,一般有以下几个解决方案,需要大家一步一步排除。
1、考虑get请求头过大,而tomcat的header缓存区又过小
那只能调整tomcat的header缓存区,在server.xml中的Connector标签中添加maxHttpHeaderSize="81920",你要是觉得不够大,可以暂时性的改成一个特别大的数值。
如果用的是SpringBoot,则可以在application.properties文件中配置【server.tomcat.max-http-header-size=81920】
观测一段时间后,如果还是出现这个报错,那么尝试下一个解决方案。
2、使用https去请求http协议
建议每次打印出请求的地址和信息,使用拦截器在preHandle中打印出request的信息,看看有没有出现这样的情况。
3、终极绝招
有时候吧,看报错时间,都是在凌晨,这个就很奇怪。
如果自己用的是8080端口,不妨改一个端口吧。改端口这个好像没什么科学依据,但确实能解决一部分人的问题。