web-dev-qa-db-fra.com

Comment obtenir une URI de requête sans chemin de contexte?

La méthode request.getRequestURI () renvoie l'URI avec le chemin de contexte.

Par exemple, si l'URL de base d'une application est http://localhost:8080/myapp/ (le chemin du contexte est myapp ) et que j'appelle request.getRequestURI() pour http://localhost:8080/myapp/secure/users, il retournera /myapp/secure/users.

Existe-t-il un moyen d’obtenir que cette partie /secure/users, c’est-à-dire l’URI sans chemin de contexte?

116
craftsman

Si vous vous trouvez dans une servlet de contrôleur frontal mappée selon un modèle de préfixe, vous pouvez simplement utiliser HttpServletRequest#getPathInfo() .

String pathInfo = request.getPathInfo();
// ...

En supposant que la servlet de votre exemple soit mappée sur /secure, le résultat retournera /users, qui correspondrait aux informations d'un seul intérêt dans une servlet de contrôleur frontal typique.

Si le servlet est toutefois mappé sur un modèle de suffixe (vos exemples d'URL n'indiquent toutefois pas que c'est le cas), ou lorsque vous êtes réellement à l'intérieur d'un filtre (lorsque le servlet à invoquer n'est pas encore déterminé, getPathInfo() pourrait retourner null), votre meilleur choix est alors de sous-chaîne vous-même l'URI de la requête en fonction de la longueur du chemin de contexte en utilisant la méthode habituelle String:

HttpServletRequest request = (HttpServletRequest) req;
String path = request.getRequestURI().substring(request.getContextPath().length());
// ...
149
BalusC
request.getRequestURI().substring(request.getContextPath().length())
70
fforw

Avec le printemps, vous pouvez faire:

String path = new UrlPathHelper().getPathWithinApplication(request);
30
James

getPathInfo () renvoie parfois null. Dans la documentation HttpServletRequest

Cette méthode renvoie la valeur null s'il n'y avait pas d'informations de chemin supplémentaires.

J'ai besoin d'obtenir un chemin d'accès au fichier sans chemin d'accès contextuel dans le filtre et getPathInfo () me renvoie la valeur null. J'utilise donc une autre méthode: httpRequest.getServletPath ()

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException
{
    HttpServletRequest httpRequest = (HttpServletRequest) request;
    HttpServletResponse httpResponse = (HttpServletResponse) response;

    String newPath = parsePathToFile(httpRequest.getServletPath());
    ...

}
15
lukastymo

Si vous utilisez request.getPathInfo () dans un filtre, vous semblez toujours obtenir la valeur null (au moins avec jetty).

Ce bogue + réponse laconique invalide fait allusion au problème je pense:

https://issues.Apache.org/bugzilla/show_bug.cgi?id=2832

Je suppose que cela est lié au fait que les filtres sont exécutés avant que le servlet ne reçoive la demande. Il peut s'agir d'un bogue de conteneur ou d'un comportement attendu que je n'ai pas été en mesure d'identifier.

Le contextPath est disponible, donc la solution fforws fonctionne même dans les filtres. Je n'aime pas avoir à le faire à la main, mais la mise en œuvre est cassée ou

6
thetoolman

Une façon de le faire consiste à arrêter le chemin de contexte de servlet à partir de l'URI de la demande.

String p = request.getRequestURI();
String cp = getServletContext().getContextPath();

if (p.startsWith(cp)) {
  String.err.println(p.substring(cp.length());
}

Lire ici .

5
PeterMmm