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

时间:2017-02-14 05:02:40

标签: tomcat8 illegalargumentexception

当我在多服务器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)

任何人都可以指导我如何解决或缩小这种做法吗?我没有得到任何我的应用程序源文件的任何引用。我试图谷歌周围,并在其说的链接,你试图通过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">

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

<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" />

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

提前致谢。

15 个答案:

答案 0 :(得分:140)

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

答案 1 :(得分:29)

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

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

可能有帮助。

答案 2 :(得分:19)

万一有人用招摇:

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

邮递员:

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

答案 3 :(得分:13)

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

答案 4 :(得分:2)

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

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

整个下午都带我去弄清楚,所以如果可以帮到我,我会很高兴的:)

答案 5 :(得分:2)

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

答案 6 :(得分: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


,然后与https一起使用的请求将正常工作。
同时向http发送的请求也将转发到https!不用担心。

答案 7 :(得分:1)

我通过在chrome浏览器中做两件事解决了该错误:

  1. 按下Ctrl + Shift +删除并从一开始清除所有浏览数据。
  2. 转到Chrome的:设置->高级设置->打开代理设置-> Internet属性,然后转到内容窗口,然后单击清除SSL状态按钮。

此网站也提供此信息和其他选项:https://www.thesslstore.com/blog/fix-err-ssl-protocol-error/

答案 8 :(得分:1)

Debian 10 中使用 Tomcat 作为应用程序服务器的 Java项目时,我遇到了这个问题。

问题在于,当我使用 http 在浏览器中调用应用程序时,该应用程序已经将 https 定义为其默认协议。因此,当我尝试运行该应用程序时,在我的日志文件中收到此错误:

INFO [http-nio-80-exec-4461] org.apache.coyote.http11.AbstractHttp11Processor.process解析HTTP请求标头时出错

注意:HTTP标头解析错误的进一步发生将记录在DEBUG级别。

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

但是我尝试在浏览器中使用 https 协议,但未连接并抛出错误:

这是我的解决方法

您需要证书才能为应用程序设置 https 协议。您可以从我们的加密获取证书。对我而言,最简单的方法是创建一个自签名证书。

我首先必须为该应用程序创建一个 keystore 文件,更像是 https 协议的自签名证书:

sudo keytool -genkey -keyalg RSA -alias tomcat -keystore /usr/share/tomcat.keystore

注意:您需要在服务器上安装Java才能执行此操作。可以使用sudo apt install default-jdk安装Java。

接下来,我在Tomcat服务器配置文件(/opt/tomcat/conf/server.xml)中为应用程序添加了 https Tomcat服务器连接器:

sudo nano /opt/tomcat/conf/server.xml

将以下内容添加到应用程序的配置中。请注意,已指定 keystore 文件位置和密码。还定义了 https 协议的端口,该端口不同于 http 协议的端口:

<Connector protocol="org.apache.coyote.http11.Http11Protocol"
           port="8443" maxThreads="200" scheme="https"
           secure="true" SSLEnabled="true"
           keystoreFile="/usr/share/tomcat.keystore"
           keystorePass="my-password"
           clientAuth="false" sslProtocol="TLS"
           URIEncoding="UTF-8"
           compression="force"
           compressableMimeType="text/html,text/xml,text/plain,text/javascript,text/css"/>

因此,在 Tomcat 服务器配置文件(/opt/tomcat/conf/server.xml)中,应用程序的完整服务器配置看起来像这样:

<Service name="my-application">
  <Connector protocol="org.apache.coyote.http11.Http11Protocol"
             port="8443" maxThreads="200" scheme="https"
             secure="true" SSLEnabled="true"
             keystoreFile="/usr/share/tomcat.keystore"
             keystorePass="my-password"
             clientAuth="false" sslProtocol="TLS"
             URIEncoding="UTF-8"
             compression="force"
             compressableMimeType="text/html,text/xml,text/plain,text/javascript,text/css"/>

  <Connector port="8009" protocol="HTTP/1.1"
             connectionTimeout="20000"
             redirectPort="8443" />

  <Engine name="my-application" defaultHost="localhost">
     <Realm className="org.apache.catalina.realm.LockOutRealm">
        <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
             resourceName="UserDatabase"/>
    </Realm>

    <Host name="localhost"  appBase="webapps"
          unpackWARs="true" autoDeploy="true">

        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
             prefix="localhost_access_log" suffix=".txt"
             pattern="%h %l %u %t &quot;%r&quot; %s %b" />

    </Host>
  </Engine>
</Service>

这一次,我尝试使用以下方法从浏览器访问应用程序:

https://my-server-ip-address:https-port

在我的情况下是:

https:35.123.45.6:8443

工作正常。虽然,我必须接受一条警告,该警告为网站添加了安全例外,因为所使用的证书是自签名证书。

仅此而已。

我希望这会有所帮助

答案 9 :(得分:1)

而不是超文本传输​​协议安全 (https),您应该将其称为http(超文本传输​​协议)

Http -- 最好

Https -- 这不是可取的

所以使用下面的 URL 格式

http://localhost:{ur application Port Number}/

答案 10 :(得分: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)

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

答案 11 :(得分:0)

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

答案 12 :(得分:0)

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

答案 13 :(得分:0)

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

答案 14 :(得分:0)

如果您是通过POSTMAN发送邮件,也可以尝试在设置中关闭SSL选项