web-dev-qa-db-fra.com

Comment autoriser le caractère ^ dans les URL pour Tomcat 8.5

J'ai une URL de demande au format ci-dessous

http://hostname:port/path&param1={"vars":[{"a":"val1","b":"^"},{"c":"val2","d":"^"}]}&param2=Value3|95|3%20-%206%20Months

J'ai changé catalina.properties selon ceci question stackoverflow .

Mais selon documentation Tomcat Tomcat.util.http.parser.HttpParser.requestTargetAllow la propriété est obsolète et les attributs relaxPathChars et relaxQueryChars doivent être utilisés avec la balise Connector à la place.

Cependant, lorsque je change le fichier xml ci-dessous

 <Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" relaxedQueryChars="^" relaxedPathChars="^"/>

Je reçois toujours une 400 mauvaise requête pour le personnage ^

Je ne sais pas si c'est la bonne configuration.

11
Sachin Kumar

Idéalement, vous devez toujours coder l'URL de vos paramètres de requête avant d'envoyer votre demande au serveur. Lire: https://www.talisman.org/~erlkonig/misc/lunatech%5Ewhat-every-webdev-must-know-about-url-encoding/

Si vous souhaitez emprunter l'itinéraire relaxQueryChars, notez que les caractères suivants de votre requête figurent également dans l'ensemble que vous devez ajouter à l'exception: " { } [ ] ^ |

Essayez ceci dans votre server.xml:

<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" relaxedQueryChars='^{}[]|&quot;' />

Plus d'informations sur relaxQueryChars/relaxPathChars sur le ticket de bogue 6227 . Le changement a été ajouté à toutes les branches de Tomat:

  • 9.0.8
  • 8.5.31
  • 8.0.52
  • 7.0.87

Je ne pense pas que vous ayez du tout besoin de l'attribut relaxPathChars (cela fait référence aux caractères sur le chemin de l'URL). Cependant, les résultats des tests de l'équipe Tomcat semblent suggérer que les éléments suivants pourraient être utilisés pour une compatibilité descendante maximale:

relaxedPathChars='[]|' relaxedQueryChars='[]|{}^&#x5c;&#x60;&quot;&lt;&gt;' />

nb/le premier argument de votre requête doit être délimité par? pas &

http://hostname:port/path?param1=...&param2=...&param3=...

22
Ed Randall