Tomcat, JAX-RS, Jersey, @PathParam: comment passer des points et des barres obliques?
De disposer d'une méthode comme ceci:
@GET @Path("/name/{name}")
@Produces(MediaType.TEXT_PLAIN)
public String getProperty(@PathParam("name") String name) {
System.out.println(name);
}
Comment puis-je passer une valeur comme "test./test"?
/name/test./test gives HTTP 404
/name/test.%2Ftest gives HTTP 400
/name/test.%252Ftest prints test%2Ftest
Mais si je ne name = URLDecoder.decode(name);
il imprime /test
et la première partie de test.
disparaît.
Il y a une ou deux questions, comme cela a déjà mais ils sont vieux et il n'y a pas de bonne solution trouvé, je pense que je vais demander à nouveau.
source d'informationauteur Maxim Suponya
Vous devez vous connecter pour publier un commentaire.
Le motif dans la
@Path
annotation est à l'intérieur transformé en une expression régulière, avec le modèle de pièces correspondant seulement des caractères sélectionnés par défaut. En particulier, ils ont normalement ne pas match/
caractères; c'est presque toujours la bonne chose à faire (comme il vous permet de placer les modèles mi-chemin à travers un chemin d'accès), mais dans ce cas, ce n'est pas que vous êtes désireux de consommer de la ensemble ultérieur chemin d'accès. Pour tout avoir, nous devons remplacer l'expression régulière fragment pour ce modèle particulier; c'est en fait assez facile, puisque nous venons de mettre dans le fragment de template un:
suivie par la RE que nous voulons utiliser:Cela correspond à tous les caractères après le
/name/
(mais pas y compris toute?
requête de la partie), mais seulement si il y a quelque chose là. Sachez que si vous avez d'autres@Path("/name/...")
choses sur, les choses peuvent être vraiment déroutant! Afin de ne pas le faire.Si vous utilisez tomcat, et que vous voulez passer
/
dans pathparam. en plus de la@Path("/name/{name:.+}")
des trucs comme "Donal Boursiers", a déclaré, vous devez ajouter-Dorg.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH=true
à votre jvm arguments, voir aussi tomcat de sécurité-howto.Essayez de spécifier le type de codage, le suivant fonctionne pour moi avec
/name/test.%252Ftest
:Glassfish v4 accepter codé scape pour slash %2f. Ensuite, nous pouvons passer à la Chaîne codée test.%2Ftest et obtenir le résultat du test./test à l'aide de URLDecoder.décoder(nom, "UTF-8"). Je pense que c'est une meilleure solution, surtout si vous avez plusieurs paramètres dans une requête. En utilisant le chemin d'accès @Path("/nom de/{nom:.+}") est excellente solution lorsque l'on a peu de paramètres dans une requête.
À l'aide de %252f complique la demande du client becouse sont nécessaires pour contruct l'encodage demande Chaîne manuellement. Avec glassfish v4 il est facile à utiliser pour cent d'encodage avec URLEncoder.encoder au client et URLDecoder.décoder dans le serveur souhaité Cordes. La plupart des langages de programmation a pour cent d'encodage et de décodage, c'est donc une solution parfaite.
J'ai essayé d'activer codé slash dans glassfish v3, mais sans succès, voici la sintaxe j'ai essayé d'utilisé
bin\asadmin ensemble configs.config.server-config.network-config.protocols.protocol.http-listener-1.http.encoded-slash-enabled=vrai configs.config.server-config.network-config.protocols.protocol.http-listener-1.http.encoded-slash-enabled=true
Jeu de commande a été exécutée avec succès.
Ce qui concerne
Cassio Seffrin