2016-12-09 6 views
25

Ich benutze Tomcat 8. In einem Fall muss ich externe Anfrage von externen Quelle, wo die Anfrage hat eine Parameter, wo es durch | getrennt ist.Tomcat 8 kann Anfrage mit '|' in Abfrageparametern?

Antrag ist wie folgt aussieht:

http://localhost:8080/app/handleResponse?msg=name|id|

In diesem Fall verfolge ich Fehler.

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) 

EDIT 1

Es arbeitet mit Apache Tomcat 8.0.30, aber nicht mit Tomcat 8.5

+5

OK, ich denke, Sie werden es entkommen müssen –

+0

Haben Sie in der einen Blick nahm referenzierter RFC? – clemens

Antwort

29

Dieses Verhalten in allen wichtigen Tomcat Versionen eingeführt:

  • Tomcat 7.0.73 , 8.0.39, 8.5.7

Für eine schnelle Lösung, Sie können auf eine ältere Version zurückstufen oder requestTargetAllow Option (see Jérémie's answer) festlegen.

Basierend auf changelog, könnten diese Änderungen dieses Verhalten beeinflussen:

Tomcat 8.5.3:

Stellen Sie sicher, dass die Anfragen mit HTTP-Methode Namen, die nicht Token sind (wie von RFC 7231 erforderlich) abgelehnt mit einer 400 Antwort

Tomcat 8.5.7:

Fügen Sie der HTTP-Anforderungszeilenanalyse zusätzliche Prüfungen für gültige Zeichen hinzu, damit ungültige Anforderungszeilen früher zurückgewiesen werden.


Aber schließlich wollen Sie Ihre URL auf den Client kodieren:

encodeURI("http://localhost:8080/app/handleResponse?msg=name|id|") 
> http://localhost:8080/app/handleResponse?msg=name%7Cid%7C 

oder Query-String:

encodeURIComponent("msg=name|id|") 
> msg%3Dname%7Cid%7C 

Es wird Sie von anderen problematischen Zeichen sichern (list of invalid URI characters) .

+1

Danke, ich habe meinen "Apache-Tomcat-8.5.11'' auf" Apache-Tomcat-8.0.30'' runtergestuft und es hat wie ein Zauber funktioniert. –

3

Flucht es. Das Pipe-Symbol ist ein Symbol, das im Laufe der Zeit und zwischen Browsern unterschiedlich gehandhabt wurde. Zum Beispiel, Chrome und Firefox konvertieren eine URL mit Pipe anders, wenn sie kopiert/eingefügt werden. Doch die meisten kompatibel und notwendig mit Tomcat 8.5 scheint es, ist es zu entkommen:

http://localhost:8080/app/handleResponse?msg=name%7Cid%7C

30

Seit Tomcat 7.0.76, 8.0.42, 8.5.12 Sie können die Eigenschaft requestTargetAllow definieren, um verbotene Zeichen zuzulassen.

Fügen Sie diese Zeile in Ihrer catalina.properties

tomcat.util.http.parser.HttpParser.requestTargetAllow=|{} 
2

die URI als UTF-8 codiert ist, aber Tomcat decodiert sie als ISO-8859-1. Sie müssen die Connector-Einstellungen in der Datei server.xml bearbeiten und das Attribut URIncoding = "UTF-8" hinzufügen.

oder bearbeiten Sie diesen Parameter auf application.properties

server.tomcat.uri-encoding = utf-8

+0

URIEncoding Attribut auf dem Element in server.xml zu etwas Bestimmtem (z. B. URIncoding = "UTF-8") (https://wiki.apache.org/tomcat/FAQ/CharacterEncoding) – hwak