Note: further occurrences of HTTP request parsing errors will be logged at DEBUG level
云服务器很久没管过了,今天去看了下云服务器日志,不看不知道,一看吓一跳。
日志里竟然是一排的报错,再翻下此前的日志,每天都报一个错误:
[http-nio-80-exec-10] org.apache.coyote.http11.Http11Processor.service Error parsing HTTP request header Note: further occurrences of HTTP request parsing errors will be logged at DEBUG level. java.lang.IllegalArgumentException: Request header is too large at org.apache.coyote.http11.Http11InputBuffer.fill(Http11InputBuffer.java:790) at org.apache.coyote.http11.Http11InputBuffer.parseRequestLine(Http11InputBuffer.java:454) at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:269) at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:893) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1723) at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:748)
随后我去查了一下,网友的说法大致为以下3种:
百度经验
1、Tomcat 的 header 缓冲区不够
需要在server.xml(tomcat根目录下的conf目录)中增加 maxHttpHeaderSize,单位为KB
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" maxHttpHeaderSize="8192"/>
2、Url头用的是 https
将 https 改成 http 即可(未实验)
3、Url传参时携带了特殊符号
增加了一个新特性,就是严格按照RFC3986规范进行访问解析
而RFC3986规范定义了Url中,只允许包含: 4个特殊字符
以及所有保留字符(RFC3986中指定了以下字符为保留字符:!*'();:@&=+$,/?#[])
解决方法其实很简单,可以通过修改 tomca t的 catalina.properties 的最后一行改为
tomcat.util.http.parser.HttpParser.requestTargetAllow=|{}
允许{}即可
测试结果
-
用的一直是 http 请求头
我的那个小项目是接收 get 参数返回二维码,错误原因有以下两点
-
-
中文未转码就进行传输,实际应用中标准方式是如果Url中有中文,则要先将中文转码后才进行请求
解决办法
-
可以使用 POST 请求
-
传参前 对参数长度进行限制
- 传参前 对特殊字符进行转码