Tomcat: java.lang.IllegalArgumentException:在方法名中发现无效字符。HTTP方法名必须是令牌

当我在多服务器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 url,这似乎不太可能。当应用程序运行在单个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" />

即使有人帮助给我的故障排除尝试的方向,这将是有用的,因为目前我不知道在哪里寻找。

439808 次浏览

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

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

在客户端URL中将https更改为http

也许会有帮助。

我得到了同样的异常,每当一个页面被加载时,

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,当我改变了一样,错误就消失了。

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

这通常发生在你使用的URI方案不被部署应用的服务器所支持的时候。因此,你可能想要检查你的服务器支持的所有方案并相应地修改你的request URI,或者,你可能想要在你的服务器中添加对该方案的支持。应用程序的范围将帮助您确定这一点。

回答这个老问题(对其他可能有帮助的人)

正确配置httpd conf将解决这个问题。如果您没有httpd服务器,请安装任何httpd服务器

在这里列出我的配置。

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

< br >

        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 with https将毫无例外地工作 同时,使用http的请求将转发给https !不用担心。< / p >

它发生在我身上,当我有一个相同的端口使用ssh隧道SOCKS运行代理在8080端口和我的服务器和我的firefox浏览器代理被设置到该端口,并得到这个问题。

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

我在chrome浏览器中做了2件事来解决这个错误:

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

这个站点有这个信息和其他选项:https://www.thesslstore.com/blog/fix-err-ssl-protocol-error/

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

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

我花了一下午的时间才弄明白,所以如果它能帮助到别人,我很高兴:)

以防有人吹牛:

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

邮差:

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

在我的情况下,我必须清除浏览器历史记录/cookie来摆脱这个错误。

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

问题是,当我在浏览器中使用http调用应用程序时,应用程序已经将https定义为默认协议。所以当我尝试运行应用程序时,我在日志文件中得到这个错误:

信息[http-nio-80-exec-4461] org.apache.coyote.http11抽象thttp11处理器。process解析HTTP请求头时出错

注意:进一步出现的HTTP头解析错误将被记录在DEBUG级别。

在方法名中发现无效字符。HTTP方法名必须是令牌

然而,我尝试在浏览器中使用https协议,但它没有连接抛出错误:

下面是我的解决方法:

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

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

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

请注意:你需要在服务器上安装Java才能做到这一点。Java可以使用sudo apt install default-jdk安装。

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

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

将以下内容添加到应用程序的配置中。注意,密钥存储库文件位置和密码被指定。还定义了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

它运行得很好。虽然,我不得不接受一个警告,它为网站添加了一个安全例外,因为所使用的证书是自签名的。

这是所有。

我希望这对你们有帮助

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

我通过简单地关闭我的vpn解决了这个问题。