Tomcat:HTTP method names must be tokens

首先呢,项目共差不多10个接口,测试均不会出现该异常。部署到服务器上,也并未在实际业务操作上 发生异常。

在...服务运行一段时间后,抛出该异常。这是阿里服务会有一个定时的自身检测吗?端口检测?菜鸟渣渣不懂

Springboot2.4.5 + Apache Tomcat/9.0.45 + JDK1.8.0_251

 以下是最近几次的日志:

2021-06-05 04:04:19.703  INFO 15135 --- [http-nio-6013-exec-5] 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 [0x030x000x00/*0xe00x000x000x000x000x00Cookie:]. HTTP method names must be tokens
	at org.apache.coyote.http11.Http11InputBuffer.parseRequestLine(Http11InputBuffer.java:417) ~[tomcat-embed-core-9.0.45.jar!/:na]
	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:261) ~[tomcat-embed-core-9.0.45.jar!/:na]
	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) [tomcat-embed-core-9.0.45.jar!/:na]
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:893) [tomcat-embed-core-9.0.45.jar!/:na]
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1707) [tomcat-embed-core-9.0.45.jar!/:na]
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-9.0.45.jar!/:na]
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_251]
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_251]
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-9.0.45.jar!/:na]
	at java.lang.Thread.run(Thread.java:748) [na:1.8.0_251]
2021-06-08 09:36:54.676  INFO 8536 --- [http-nio-6013-exec-2] 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 [0x030x000x00/*0xe00x000x000x000x000x00Cookie:]. HTTP method names must be tokens
	at org.apache.coyote.http11.Http11InputBuffer.parseRequestLine(Http11InputBuffer.java:417) ~[tomcat-embed-core-9.0.45.jar!/:na]
	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:261) ~[tomcat-embed-core-9.0.45.jar!/:na]
	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) [tomcat-embed-core-9.0.45.jar!/:na]
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:893) [tomcat-embed-core-9.0.45.jar!/:na]
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1707) [tomcat-embed-core-9.0.45.jar!/:na]
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-9.0.45.jar!/:na]
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_251]
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_251]
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-9.0.45.jar!/:na]
	at java.lang.Thread.run(Thread.java:748) [na:1.8.0_251]
2021-06-11 13:54:43.712  INFO 8496 --- [http-nio-6013-exec-10] 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 [l0x000x0b0x000x000x000x000x000x000x000x00...]. HTTP method names must be tokens
	at org.apache.coyote.http11.Http11InputBuffer.parseRequestLine(Http11InputBuffer.java:417) ~[tomcat-embed-core-9.0.45.jar!/:na]
	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:261) ~[tomcat-embed-core-9.0.45.jar!/:na]
	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) [tomcat-embed-core-9.0.45.jar!/:na]
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:893) [tomcat-embed-core-9.0.45.jar!/:na]
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1707) [tomcat-embed-core-9.0.45.jar!/:na]
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-9.0.45.jar!/:na]
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_251]
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_251]
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-9.0.45.jar!/:na]
	at java.lang.Thread.run(Thread.java:748) [na:1.8.0_251]
2021-06-11 20:06:43.128  INFO 19046 --- [http-nio-6013-exec-6] 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 [0x160x030x010x020x000x010x000x010xfc0x030x030xf20x990xe20xa40x190xd20xfc0x1b0x80^G0xc50xef0x1d0xb30x830x0b0x070x92meF0x1a_`0xfci0x0f0xc3~0xfd0x95]. HTTP method names must be tokens
	at org.apache.coyote.http11.Http11InputBuffer.parseRequestLine(Http11InputBuffer.java:417) ~[tomcat-embed-core-9.0.45.jar!/:na]
	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:261) ~[tomcat-embed-core-9.0.45.jar!/:na]
	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) [tomcat-embed-core-9.0.45.jar!/:na]
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:893) [tomcat-embed-core-9.0.45.jar!/:na]
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1707) [tomcat-embed-core-9.0.45.jar!/:na]
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-9.0.45.jar!/:na]
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_251]
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_251]
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-9.0.45.jar!/:na]
	at java.lang.Thread.run(Thread.java:748) [na:1.8.0_251]

查看了对应的异常方法Http11InputBuffer.parseRequestLine,解析请求头 第二行的时候,

if (this.parsingRequestLinePhase == 2) {

问题是这里抛出来的,这是啥呀呀


    if  (!HttpParser.isToken(this.chr)) {
        this.request.protocol().setString("HTTP/1.1");
        String invalidMethodValue = this.parseInvalid(this.parsingRequestLineStart, this.byteBuffer);
        throw new IllegalArgumentException(sm.getString("iib.invalidmethod", new Object[]{invalidMethodValue}));
    }

该部分完整的源代码

if (this.parsingRequestLinePhase == 2) {
    space = false;

    while(true) {
        while(!space) {
            if (this.byteBuffer.position() >= this.byteBuffer.limit() && !this.fill(false)) {
                return false;
            }

            pos = this.byteBuffer.position();
            this.chr = this.byteBuffer.get();
            if (this.chr != 32 && this.chr != 9) {
                if (!HttpParser.isToken(this.chr)) {
                    this.request.protocol().setString("HTTP/1.1");
                    String invalidMethodValue = this.parseInvalid(this.parsingRequestLineStart, this.byteBuffer);
                    throw new IllegalArgumentException(sm.getString("iib.invalidmethod", new Object[]{invalidMethodValue}));
                }
            } else {
                space = true;
                this.request.method().setBytes(this.byteBuffer.array(), this.parsingRequestLineStart, pos - this.parsingRequestLineStart);
            }
        }

        this.parsingRequestLinePhase = 3;
        break;
    }
}

 

Invalid character found in method name [0x160x030x010x020x000x010x000x010xfc0x030x030xf20x990xe20xa40x190xd20xfc0x1b0x80^G0xc50xef0x1d0xb30x830x0b0x070x92meF0x1a_`0xfci0x0f0xc3~0xfd0x95] ,这个咋解析呀

 

 后来按照网络的方式,增加了http-post缓冲区,无效的呀。

server:
  port: 6013
  tomcat:
    # java.lang.IllegalArgumentException: Invalid character found in method name [0x030x000x00/*0xe00x000x000x000x000x00Cookie:]. HTTP method names must be tokens
    # 可能解决的方案:设置max-http-form-post-size,默认2MB。
    max-http-form-post-size: 10MB

 

最后:这怎么排查到底是哪个请求出的问题?ww 

 

 

 

 

这个问题不用去管,其实就是客户端发起的HTTP请求不规范,请求数据没有按照要求编码。服务器没法解析,就给了这个DEBUG信息。你也没法去管,毕竟你没办法控制客户通过TCP往服务器提发送什么数据。

可以下载向日葵 远程连接软件,然后将授权码通过卡片的头像私信给我,这边提供远程连接技术支持。

您好,我是有问必答小助手,您的问题已经有小伙伴解答了,您看下是否解决,可以追评进行沟通哦~

如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~

ps: 问答会员【8折】购 ,仅需→23.2元,即可享受5次/月 有问必答服务,了解详情>>>https://t.csdnimg.cn/RW5m