java.lang.IllegalArgumentException:在方法名称中找到无效字符。HTTP方法名称必须是令牌


161

在多服务器Apache Tomcat 8环境中部署应用程序时,我处于堆栈跟踪之下。我经常收到此错误,似乎正在阻止tomcat线程:

INFO [http-nio-80-exec-4461] org.apache.coyote.http11.AbstractHttp11Processor.process Error parsing HTTP request header
 Note: further occurrences of HTTP header 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.AbstractNioInputBuffer.parseRequestLine(AbstractNioInputBuffer.java:233)
 at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1017)
 at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:684)
 at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1524)
 at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1480)
 at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
 at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
 at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
 at java.lang.Thread.run(Unknown Source)

任何人都可以指导我如何解决此类问题或缩小范围吗?我没有任何引用到我的任何应用程序源文件。我试图在Google周围搜索,在它说的链接中,您正在尝试通过https访问http url,这似乎不太可能。当应用程序在单个Tomcat 8实例上运行时,我没有收到此错误。我只能在多服务器环境中得到它。

我还分享了我嵌入在每个页面上的meta标签,如果这有助于确定原因。

<%
    response.setHeader("Cache-Control", "no-cache");
    response.setHeader("Cache-Control", "no-store");
    response.setDateHeader("Expires", 0);
    response.setHeader("Pragma", "no-cache");
%>


<head>
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, minimum-scale=1.0, maximum-scale=1.0">
<meta name="viewport" content="width=device-width, initial-scale=1">

我还在几页中使用以下内容,这些内容基本上与上述内容相同:

<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta http-equiv="Expires" content="-1" />
<meta http-equiv="Cache-Control" content="private" />
<meta http-equiv="Cache-Control" content="no-store" />
<meta http-equiv="Pragma" content="no-cache" />

即使有人帮助指导我的故障排除尝试,这也很有用,因为目前我不知道应该去哪里研究。

提前致谢。

Answers:


265

当您尝试从未启用HTTPS的端点上的客户端执行HTTPS请求时,可能会发生此异常。当服务器需要原始数据时,客户端将加密请求数据。


1
我不确定我是否理解此答案。我有一个Spring Boot 1.5.1应用程序,并且在日志中看到了此异常。我的应用仅在端口8443(从端口​​443重定向)上回答SSL,并且只有一个SSL连接器。您是说有人可以在端口443上尝试使用http:而不是https:吗?
Jim Archer

5
当服务器的期望值与获得的结果不匹配时,会发生此类异常。您所说的是可能的情况之一。也许您的服务器中有一个不在https上运行的终结点,但是有人试图以此方式访问它?
Petar Tonev '17

1
嗨,彼得...问题最终是有人创建了IP表规则来将端口80转发到端口8443,因此,任何在端口80上使用http访问站点的人都导致了该错误。我们添加了Tomcat连接器,将端口8080重定向到8443,并设置了IP表规则以将端口80转发到端口8080,问题几乎消失了。感谢您的答复!
吉姆·阿彻

1
@PeterTonev:任何想法如何(将https重定向到http ||禁用https ||捕获错误至少显示有意义的错误消息)?
crusy

1
@crusy可能对您有所帮助的异常处理方法是链接
Petar Tonev

56

我在本地测试时遇到了同样的异常。问题是我的请求中的URL模式。

更改 https:// to http:// in your client url.

可能有帮助。


2
当然可以,但是请注意通过HTTP进行的通信不安全。
Paramvir Singh Karwal,

23

您正在使用http:// localhost:8080 / foo / bar 调用本地服务器。使用https:// localhost:8080 / foo / bar进行调用。这样解决了问题


也许您在8080上将没有https://。将呼叫更改为https:// localhost:8443 / foo / bar-这是示例链接 – Rodrigo R. Coelho
Rodrigo R. Coelho

9

如果有人使用招摇:

在执行之前,根据需要将Scheme更改为HTTPHTTPS

邮差:

将URL路径更改为URL 地址http://https://在URL地址中


8

我收到了与任何TLS问题无关的异常。在我的情况下,Content-Length标头值与主体长度不匹配。


2
我感激不尽。其他所有POST请求均失败,并显示错误400,并且我准备将头发撕开。事实证明,不发送content-length标头可以解决此问题。
亚历山大·伍德伯德

2
对于邮递员向本地开发人员的请求,我得到了30-90秒的延迟-原来是这个问题!禁用Content-Length标题可固定延迟。
Alok

1

回答这个旧问题(对于其他可能会有所帮助的问题),

正确配置httpd conf将使问题得以解决。如果没有httpd服务器,请安装它。

在这里列出我的配置。

[smilyface@box002 ~]$ cat /etc/httpd/conf/httpd.conf | grep shirts | grep -v "#"


        ProxyPass /shirts-service http://local.box002.com:16743/shirts-service
        ProxyPassReverse /shirts-service http://local.box002.com:16743/shirts-service
        ProxyPass /shirts http://local.box002.com:16443/shirts
        ProxyPassReverse /shirts http://local.box002.com:16443/shirts
        ...
        ...
        ...

如上所述编辑文件,然后如下重新启动httpd

[smilyface@box002 ~]$ sudo service httpd restart


然后with的请求https将毫无例外地工作。
也要求与http将转发https!别担心。



1

我知道这是一个旧线程,但是在特定情况下可能会发生这种情况:

如果您使用结合了VPC链接的AWS api网关,并且网络负载平衡器启用了代理协议v2,则也会发生400错误请求。

整个下午花了我很多时间来解决这个问题,所以如果它可以帮助某人,我会很高兴的:)


0

每当加载页面时,我都会遇到同样的异常,

NFO: Error parsing HTTP request header
 Note: further occurrences of HTTP header 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.InternalInputBuffer.parseRequestLine(InternalInputBuffer.java:139)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1028)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:637)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316)
    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)

我发现我的页面网址之一是https而不是http,当我更改相同的网址时,错误消失了。


0

当您使用应用程序所在的服务器不支持的URI方案时,通常会发生这种情况。因此,您可能要检查服务器支持的所有方案并相应地修改请求URI,或者可能要在服务器中添加对该方案的支持。您的应用程序范围应有助于您做出决定。


0

当我在ssh隧道SOCKS中使用相同的端口在8080端口中运行代理并且我的服务器和我的firefox浏览器代理设置为该端口并遇到此问题时,这件事发生了。


0

就我而言,我必须清除浏览器历史记录/ cookie才能摆脱此错误。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.