web-dev-qa-db-ja.com

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)

誰かがどのようにトラブルシューティングやそのような例外を絞り込むかを私に指示することができますか?私は自分のアプリケーションのソースファイルのどれも参照していません。私はGoogleを試してみました、そしてそれが言ったリンクの中で、あなたは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" />

誰かが私のトラブルシューティングの試みを指示するのを手伝ってくれたとしても、現在私はどこを調べるべきかわからないので、それは役に立つでしょう。

前もって感謝します。

77
user2016012

Httpsが有効になっていないエンドポイントでクライアントからhttps要求を実行しようとしたときに、この例外が発生する可能性があります。サーバーが生データを期待している場合、クライアントは要求データを暗号化します。

134
Petar Tonev

ローカルでテストしたときにも同じ例外が発生しました。問題は私のリクエストのURLスキーマでした。

https:// to http:// in your client url.を変更

おそらくそれは役立ちます。

29
Dev4World

ローカルサーバーを http :// localhost:8080/foo/barで呼び出しています。 https :// localhost:8080/foo/barで呼び出します。これは問題を解決します

13
Shivan Sawant

SSLの問題とは無関係にこの例外を受け取りました。私の場合、Content-Lengthヘッダー値は本文の長さと一致しませんでした。

2
mibollma

この古い質問に答える(助けになるかもしれない他の人のために)

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を指定したrequestは例外なく動作します。
またhttpでリクエストするとhttpsに転送されます心配ない。

1
smilyface

私は8080ポートでプロキシを実行するためにsshトンネルSOCKSで使われているのと同じポートを持っていて、私のサーバーと私のFirefoxブラウザプロキシがそのポートに設定されていてこの問題を起こしました。

0
privatejava

ページが読み込まれるたびに、私は同じ例外を受けていました、

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の1つがhttpではなくhttpsであることを発見しました、私が同じ変更をしたとき、エラーは消えました。

0

これは通常、 URIスキームを使用している場合に発生します アプリケーションがデプロイされているサーバーではサポートされていません。そのため、サーバーがサポートしているすべてのスキームを確認し、それに応じて要求URIを変更するか、サーバーにそのスキームのサポートを追加することをお勧めします。あなたのアプリケーションの範囲はあなたがこれを決めるのを助けるべきです。

0
noob