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

use*_*012 119 illegalargumentexception tomcat8

当我在多服务器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)
Run Code Online (Sandbox Code Playgroud)

任何人都可以指导我如何解决或缩小这种做法吗?我没有得到任何我的应用程序源文件的任何引用.我试图谷歌周围,并在其说的链接,你试图通过https访问http网址,这似乎不太可能.当应用程序在单个Tomcat 8实例上运行时,我没有收到此错误.我只在多服务器环境中得到它.

我也在分享我在每个页面上嵌入的元标记,如果这有助于确定原因.

<%
    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">
Run Code Online (Sandbox Code Playgroud)

我也在几页中使用以下内容,基本上与上面相同:

<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" />
Run Code Online (Sandbox Code Playgroud)

即使有人帮助指导我的故障排除尝试,这将是有用的,因为目前我不知道,在哪里查看.

提前致谢.

Pet*_*nev 204

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

  • 我不确定我是否理解这个答案。我有一个 Spring Boot 1.5.1 应用程序,我在日志中看到了这个异常。我的应用程序仅在端口 8443(从端口​​ 443 重定向)上响应 SSL,并且只有一个 SSL 连接器。您是说有人可以在端口 443 上尝试 http: 而不是 https: 吗? (5认同)
  • 当服务器期望与内容之间存在不匹配时,就会发生这种异常.你说的是可能的情景之一.也许您的服务器中有一个端点不能在https上运行,但有人试图以这种方式访问​​它? (5认同)
  • 嗨 Peter...问题最终是有人创建了一个 IP 表规则将端口 80 转发到端口 8443,因此任何在端口 80 上使用 http 访问该网站的人都会导致该错误。我们添加了一个 Tomcat 连接器以将端口 8080 重定向到 8443,并设置 IP 表规则以将端口 80 转发到端口 8080,问题几乎消失了。感谢您的回复! (2认同)
  • @PeterTonev:知道如何(将 https 重定向到 http || 禁用 https || 捕获错误以至少显示有意义的错误消息)? (2认同)

Jus*_*ode 40

我在本地测试时遇到了同样的异常.问题是我的请求中的URL架构.

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

可能有帮助.

  • 当然可以,但请注意,通过 HTTP 进行的通信并不安全。 (3认同)

Cyb*_*ber 23

如果有人使用招摇:

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

邮差:

将 URL Path 更改为http://https://在 url 地址中


Shi*_*ant 20

您使用http:// localhost:8080/foo/bar 调用本地服务器.使用https:// localhost:8080/foo/bar 调用它.这解决了这个问题

  • 8080 上可能没有 https://。将调用更改为 **https://** localhost:8443/foo/bar - 这是示例 [链接](https://dzone.com/articles /setting-ssl-tomcat-5-分钟) – Rodrigo R. Coelho (2认同)
  • 恰恰相反 - 必须将 **https** 更改为 **http** (2认同)

mib*_*lma 10

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

  • 我对你感激不尽。其他所有 POST 请求都失败并出现错误 400,我已经准备好抓狂了。事实证明,不发送“content-length”标头可以解决这个问题。 (3认同)
  • 我收到 Postman 向本地开发人员发出的请求延迟了 30-90 秒 - 事实证明,就是这个问题!禁用“Content-Length”标头修复了延迟。 (2认同)

小智 8

我通过将https替换为http解决了这个问题


Dan*_*iel 5

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

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

我花了整个下午才弄清楚,所以如果它可以帮助别人,我会很高兴:)