Tomcat 8を使用しています。1つのケースでは、|
で区切られたパラメーターを持つ外部ソースからの外部要求を処理する必要があります。
リクエストは次のようになります。
http://localhost:8080/app/handleResponse?msg=name|id|
この場合、次のエラーが発生します。
Java.lang.IllegalArgumentException: Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986
at org.Apache.coyote.http11.Http11InputBuffer.parseRequestLine(Http11InputBuffer.Java:467)
at org.Apache.coyote.http11.Http11Processor.service(Http11Processor.Java:667)
at org.Apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.Java:66)
at org.Apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.Java:789)
at org.Apache.Tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.Java:1455)
at org.Apache.Tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.Java:49)
at Java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.Java:1142)
at Java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.Java:617)
at org.Apache.Tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.Java:61)
at Java.lang.Thread.run(Thread.Java:745)
編集1
Apache Tomcat 8.0.30で動作しますが、Tomcat 8.5では動作しません
この動作は、すべての主要なTomcatリリースで導入されています。
修正するには、次のいずれかを実行します。
relaxedQueryChars
を設定してこの文字を許可します(推奨、 リンカーンの答えを参照 )requestTargetAllow
オプション(Tomcat 8.5で非推奨)( ジェレミーの答えを参照 )。changelog に基づいて、これらの変更はこの動作に影響を与える可能性があります。
Tomcat 8.5.3:
トークンではないHTTPメソッド名(RFC 7231で要求される)を持つ要求が400応答で拒否されることを確認します
Tomcat 8.5.7:
有効な文字の追加チェックをHTTPリクエスト行の解析に追加して、無効なリクエスト行がより早く拒否されるようにします。
最良のオプション(標準に準拠)-クライアントでURLをエンコードする場合:
encodeURI("http://localhost:8080/app/handleResponse?msg=name|id|")
> http://localhost:8080/app/handleResponse?msg=name%7Cid%7C
または単にクエリ文字列:
encodeURIComponent("msg=name|id|")
> msg%3Dname%7Cid%7C
他の問題のある文字( 無効なURI文字のリスト )から保護します。
Tomcat7.0.76、8.0.42、8.5.12プロパティ requestTargetAllow
を定義して、禁止文字を許可できます。
この行をcatalina.properties
に追加します
Tomcat.util.http.parser.HttpParser.requestTargetAllow=|{}
問題:Tomcat(7.0.88)が例外の下にスローされ、400 – Bad Requestになります。
Java.lang.IllegalArgumentException: Invalid character found in the request target.
The valid characters are defined in RFC 7230 and RFC 3986.
この問題は、7.0.88以降のほとんどのTomcatバージョンで発生しています。
解決策:(Apacheチームが推奨):
Tomcatはセキュリティを強化し、クエリ文字列に生の角括弧を許可しなくなりました。リクエストには[、](角かっこ)があるため、リクエストはサーバーによって処理されません。
Server.xmlの下のタグの下にrelaxedQueryChars
属性を追加します(%Tomcat_HOME%/ conf):
<Connector port="80"
protocol="HTTP/1.1"
maxThreads="150"
connectionTimeout="20000"
redirectPort="443"
compression="on"
compressionMinSize="2048"
noCompressionUserAgents="gozilla, traviata"
compressableMimeType="text/html,text/xml"
relaxedQueryChars="[,]"
/>
アプリケーションがデフォルトでTomcatでサポートされていない特殊文字をさらに必要とする場合、上記のようにコンマで区切られたrelaxedQueryChars
属性にそれらの特殊文字を追加します。
パラメーターTomcat.util.http.parser.HttpParser.requestTargetAllow
は、Tomcat 8.5以降では非推奨です: Tomcat official doc 。
コネクタ定義でrelaxedQueryChars / relaxedPathChars
を使用して、これらの文字を許可できます: Tomcat official doc 。
URIはUTF-8としてエンコードされていますが、TomcatはそれらをISO-8859-1としてデコードしています。 server.xmlのコネクタ設定を編集し、URIEncoding = "UTF-8"属性を追加する必要があります。
または、application.propertiesでこのパラメーターを編集します
server.Tomcat.uri-encoding = utf-8
それをエスケープします。パイプ記号は、時間の経過とブラウザ間で異なる方法で処理されたものです。たとえば、ChromeとFirefoxは、コピー/貼り付けの際にURLをパイプで異なる方法で変換します。ただし、Tomcat 8.5と最も互換性があり、必要なのは、Tomcat 8.5をエスケープすることです。
http:// localhost:8080/app/handleResponse?msg = name%7Cid%7C