Tomcat 8 n'est pas en mesure de gérer la requête get avec un '|' dans les paramètres de requête?
Je suis en utilisant Tomcat 8. Dans un cas, j'ai besoin de gérer de demande externe provenant d'une source extérieure où la demande a un des paramètres pour lesquels il est séparé par |
.
Demande ressemble à ceci:
http://localhost:8080/app/handleResponse?msg=name|id|
Dans ce cas, je suis d'erreur suivant.
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
Il fonctionne avec Apache Tomcat 8.0.30 mais pas avec Tomcat 8.5
- OK, je suppose que vous aurez à y échapper
- Avez-vous pris un coup d'oeil en référence à la RFC?
Vous devez vous connecter pour publier un commentaire.
Ce comportement est introduit dans toutes les principales versions de Tomcat:
À réparer, effectuez l'une des opérations suivantes:
relaxedQueryChars
pour permettre à ce personnage(recommandé, voir Lincoln répondre)
requestTargetAllow
option(obsolète dans Tomcat 8.5) (voir la réponse de Jérémie).
Basé sur changelog, ces changements pourraient influer sur ce comportement:
Tomcat 8.5.3:
Tomcat 8.5.7:
La meilleure option (standard) - vous souhaitez encoder votre URL sur le client:
ou tout simplement de la chaîne de requête:
Elle s'assure de vous à partir d'autres problématiques caractères (liste des URI non valide caractères).
apache-tomcat-8.5.11
àapache-tomcat-8.0.30
et cela a fonctionné comme un charme.relaxedQueryChars
- Dans le long terme, n'importe où dans le code qui utilise réservé RFC 3986 de caractères doit être remaniée.relaxedQueryChars
est encore modifiable uniquement. Est-il la bonne solution fourni par Apache?Depuis Tomcat 7.0.76, 8.0.42, 8.5.12 vous pouvez définir la propriété
requestTargetAllow
pour permettre interdit de faire des personnages.Ajouter cette ligne dans votre
catalina.properties
Le paramètre
tomcat.util.http.parser.HttpParser.requestTargetAllow
est obsolète depuis Tomcat 8.5: tomcat officiel doc.Vous pouvez utiliser
relaxedQueryChars /relaxedPathChars
dans les connecteurs de la définition de permettre à ces caractères: tomcat officiel doc.Question:
Tomcat (7.0.88) est en train de jeter ci-dessous exception qui conduit à 400 Bad Request.
Ce problème se produit la plupart des versions de tomcat à partir de 7.0.88 partir.
Solution: (Suggéré par l'équipe Apache):
Tomcat augmenté leur sécurité et ne permet plus cru crochets dans la chaîne de requête. Dans la demande, nous avons [,] (crochets) de sorte que la demande n'est pas traitée par le serveur.
Ajouter
relaxedQueryChars
en vertu de l'attribut de balise en vertu de server.xml (%TOMCAT_HOME%/conf):Si l'application a besoin de plus de caractères spéciaux ne sont pas pris en charge par tomcat par défaut, puis ajouter les caractères spéciaux dans
relaxedQueryChars
attribut séparés par des virgules, comme ci-dessus.L'URI est codé en UTF-8, mais Tomcat est le décodage comme ISO-8859-1. Vous avez besoin de modifier les paramètres du connecteur dans le server.xml et ajouter le URIEncoding="UTF-8" attribut.
ou de modifier ce paramètre sur votre application.propriétés
serveur.tomcat.uri-encoding=utf-8
Échapper. La pipe est celui qui a été traitée différemment dans le temps et entre les navigateurs. Par exemple, le Chrome et Firefox convertir une URL avec tuyau différemment lorsque les copier/coller. Cependant, le plus compatible, et nécessaire avec Tomcat 8.5 il semble, est de s'en échapper:
http://localhost:8080/app/handleResponse?msg=name%7Cid%7C