Je fabrique un contrôleur frontal simple et très léger. J'ai besoin de faire correspondre les chemins de requête à différents gestionnaires (actions) afin de choisir le bon.
Sur ma machine locale HttpServletRequest.getPathInfo()
et HttpServletRequest.getRequestURI()
renvoyer les mêmes résultats. Mais je ne suis pas sûr de ce qu'ils reviendront dans l'environnement de production.
Alors, quelle est la différence entre ces méthodes et que dois-je choisir?
Réponses:
getPathInfo()
donne les informations de chemin supplémentaires après l'URI, utilisées pour accéder à votre servlet, où asgetRequestURI()
donne l'URI complet.J'aurais pensé qu'ils seraient différents, étant donné qu'un servlet doit être configuré avec son propre modèle d'URI en premier lieu; Je ne pense pas avoir déjà servi un servlet à partir de la racine (/).
Par exemple, si le servlet 'Foo' est mappé à l'URI '/ foo', j'aurais pensé que l'URI:
Se traduirait par:
et
la source
getRequestURI()
me donne la chaîne"/foo/path/to/resource"
comme prévu, maisgetPathInfo()
pour le mêmeHttpServletRequest
objet me donnenull
. Que se passe-t-il dans le monde? EDIT: Il est répondu ci-dessous par l'utilisateur "30thh".Je vais mettre un petit tableau de comparaison ici (juste pour l'avoir quelque part):
Le servlet est mappé en tant que
/test%3F/*
et l'application est déployée sous/app
.http://30thh.loc:8480/app/test%3F/a%3F+b;jsessionid=S%3F+ID?p+1=c+d&p+2=e+f#a
Dans l'exemple ci-dessus, le serveur s'exécute sur le
localhost:8480
et le nom a30thh.loc
été mis dans lehosts
fichier OS .commentaires
"+" est traité comme un espace uniquement dans la chaîne de requête
L'ancre "#a" n'est pas transférée vers le serveur. Seul le navigateur peut fonctionner avec.
Si le
url-pattern
mappage du servlet ne se termine pas par*
(par exemple/test
ou*.jsp
),getPathInfo()
renvoienull
.Si Spring MVC est utilisé
La méthode
getPathInfo()
retournenull
.La méthode
getServletPath()
renvoie la partie entre le chemin de contexte et l'ID de session. Dans l'exemple ci-dessus, la valeur serait/test?/a?+b
Soyez prudent avec les parties encodées en URL de
@RequestMapping
et@RequestParam
dans Spring. Il est bogué (version actuelle 3.2.4) et ne fonctionne généralement pas comme prévu .la source
If the url-pattern in the servlet mapping does not end with * (for example /test or *.jsp), getPathInfo() returns null.
brillant.getRequestURI()
etgetRequestURL()
devrait retourner jsessionid non décodé, dans ce casS%3F+ID
. Du moins, c'est le cas sur Tomcat / 8.5.6.Décomposons l'URL complète qu'un client taperait dans sa barre d'adresse pour atteindre votre servlet:
http://www.example.com:80/awesome-application/path/to/servlet/path/info?a=1&b=2#boo
Les pièces sont:
http
www.example.com
80
awesome-application
path/to/servlet
path/info
a=1&b=2
boo
L'URI de la requête (retourné par getRequestURI ) correspond aux parties 4, 5 et 6.
(d'ailleurs, même si vous ne le demandez pas, la méthode getRequestURL vous donnera les parties 1, 2, 3, 4, 5 et 6).
Maintenant:
Ce qui suit est toujours valable (sauf pour les différences de codage d'URL):
L'exemple suivant de la spécification Servlet 3.0 est très utile:
Remarque: l' image suit, je n'ai pas le temps de recréer en HTML:
la source
Considérez la configuration de servlet suivante:
Maintenant, lorsque j'atteins l'URL
http://localhost:8084/JSPTemp1/NewServlet/jhi
, elle sera appeléeNewServlet
telle qu'elle est mappée avec le modèle décrit ci-dessus.Ici:
Nous avons ceux-là:
getPathInfo()
getRequestURI()
la source