J'utilise Tomcat 8. Dans un cas, je dois gérer une requête externe provenant d'une source externe dans laquelle la requête a des paramètres où elle est séparée par |
.
La demande ressemble à ceci:
http://localhost:8080/app/handleResponse?msg=name|id|
Dans ce cas, je reçois l'erreur suivante.
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
Cela fonctionne avec Apache Tomcat 8.0.30 mais pas avec Tomcat 8.5
Ce comportement est introduit dans toutes les versions majeures de Tomcat:
Pour résoudre ce problème, effectuez l’une des opérations suivantes:
relaxedQueryChars
pour autoriser ce caractère (recommandé, voir la réponse de Lincoln )requestTargetAllow
option (obsolète dans Tomcat 8.5) ( voir la réponse de Jérémie ).Basé sur changelog , ces modifications pourraient affecter ce comportement:
Tomcat 8.5.3:
Assurez-vous que les demandes avec des noms de méthode HTTP qui ne sont pas des jetons (comme requis par la RFC 7231) sont rejetées avec une réponse 400
Tomcat 8.5.7:
Ajoutez des vérifications supplémentaires pour les caractères valides à l'analyse de la ligne de requête HTTP afin que les lignes de requête non valides soient rejetées plus tôt.
La meilleure option (suivant la norme) - vous voulez encoder votre URL sur le client:
encodeURI("http://localhost:8080/app/handleResponse?msg=name|id|")
> http://localhost:8080/app/handleResponse?msg=name%7Cid%7C
ou simplement la chaîne de requête:
encodeURIComponent("msg=name|id|")
> msg%3Dname%7Cid%7C
Cela vous protégera des autres caractères problématiques ( liste des caractères d'URI non valides ).
Depuis Tomcat 7.0.76 , 8.0.42 , 8.5.12 vous pouvez définir la propriété requestTargetAllow
pour autoriser les caractères interdits.
Ajouter cette ligne dans votre catalina.properties
Tomcat.util.http.parser.HttpParser.requestTargetAllow=|{}
Problème: Tomcat (7.0.88) émet une exception ci-dessous, qui conduit à 400 - Bad Request.
Java.lang.IllegalArgumentException: Invalid character found in the request target.
The valid characters are defined in RFC 7230 and RFC 3986.
Ce problème se produit dans la plupart des versions de Tomcat à partir de la version 7.0.88.
Solution: (Suggérée par l'équipe Apache):
Tomcat a renforcé leur sécurité et n'autorise plus les crochets bruts dans la chaîne de requête. Dans la requête, nous avons [] (crochets), de sorte que la requête n’est pas traitée par le serveur.
Ajoutez l'attribut relaxedQueryChars
sous la balise sous server.xml (% 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="[,]"
/>
Si l'application nécessite davantage de caractères spéciaux qui ne sont pas pris en charge par Tomcat par défaut, ajoutez ces caractères spéciaux dans l'attribut relaxedQueryChars
, séparés par une virgule comme ci-dessus.
Le paramètre Tomcat.util.http.parser.HttpParser.requestTargetAllow
est obsolète depuis Tomcat 8.5: documentation officielle de Tomcat .
Vous pouvez utiliser relaxedQueryChars / relaxedPathChars
dans la définition des connecteurs pour autoriser les caractères suivants: documentation officielle de Tomcat .
L'URI est codé au format UTF-8, mais Tomcat les décode au format ISO-8859-1. Vous devez modifier les paramètres du connecteur dans le fichier server.xml et ajouter l'attribut URIEncoding = "UTF-8".
ou éditez ce paramètre sur votre application.properties
server.Tomcat.uri-encoding = utf-8
Échapper. Le symbole de pipe est un symbole qui a été géré différemment dans le temps et entre les navigateurs. Par exemple, Chrome et Firefox convertissent différemment une URL avec un tuyau lors de leur copier/coller. Cependant, le plus compatible et nécessaire avec Tomcat 8.5 semble être de lui échapper:
http: // localhost: 8080/app/handleResponse? msg = nom% 7Cid% 7C