这段时间tomcat日志中出现Invalid character found in the HTTP protocol,还有Invalid character found in method name.HTTP method names must be tokens
下面是具体报错信息,试了很久,找到了原因

Note: further occurrences of HTTP request parsing errors will be logged at DEBUG level.
java.lang.IllegalArgumentException: Invalid character found in the HTTP protocol [HTTP/1.10x0aHost:]
at org.apache.coyote.http11.Http11InputBuffer.parseRequestLine(Http11InputBuffer.java:560)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:260)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1590)
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)
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
at org.apache.coyote.http11.Http11InputBuffer.parseRequestLine(Http11InputBuffer.java:418)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:260)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1590)
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)

解决方法

在网上查了很久,找到很多解决方法,下面我们来看
(1)在server.xml的Connector添加maxHttpHeaderSize=”8192”
这个参数是设置请求头长度的,不过貌似没有解决问题
(2)删除server.xml的监听
看到stackOverflow中说删除server.xml下面的监听,不过我试过了,并没有解决,我的日志中还是会出此类错误

<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />

(3)涉及非法字符的原因
tomcat在7.0.73, 8.0.39, 8.5.7 版本后,对http解析时做了严格限制。RFC3986文档规定,请求url中只允许包含字母(a-zA-Z)、数字(0-9)和 -_.~ 4个特殊字符,以及保留字符! * ’ ( ) ; : @ & = + $ , / ? # [ ])
如果你的url请求中包含这些以外的特殊字符,可以在conf/catalina.properties中最后添加2行:

tomcat.util.http.parser.HttpParser.requestTargetAllow=|{}
org.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH=true

在conf/server.xml的Connector添加

relaxedPathChars="[]|{}^&#x5c;&#x60;&quot;&lt;&gt;" 
relaxedQueryChars="[]|{}^&#x5c;&#x60;&quot;&lt;&gt;"

(4)还有一种说法是跟https有关
说是原本是http的请求,然后错误使用https访问导致的,首先我这个http和https都是可以访问的,不存在这种情况,然后代码里面有一些第三方的调用,也是没有问题的
(5)非法访问
网上看到一篇博客有说可能一些非法访问的请求也会导致这种问题,我找到了报错信息的具体时间,然后找到localhost_access_log.2020-08-20.txt


这种情况导致这种错误也是不可避免的