136 votes

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

La Méthode de la demande.getRequestURI() retourne l'URI avec le chemin de contexte.

Par exemple, si l'URL de base de l'application est - http://localhost:8080/myapp/ (c'est à dire le chemin de contexte est myapp), et je request.getRequestURI() pour http://localhost:8080/myapp/secure/users, il sera de retour /myapp/secure/users.

Est-il de toute façon on ne peut obtenir que cette partie /secure/users, c'est à dire l'URI sans chemin de contexte?

167voto

BalusC Points 498232

Si vous êtes à l'intérieur d'un front contolleur servlet, qui est mappé sur un préfixe de modèle, vous pouvez simplement utiliser HttpServletRequest#getPathInfo().

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

En supposant que la servlet dans votre exemple est mappé sur /secure, puis ce sera le retour de /users qui serait à l'information d'intérêt unique à l'intérieur d'un typique contrôleur frontal servlet.

Si le servlet est cependant représentée sur un motif de suffixe (votre URL exemples, cependant, ne pas indiquer que c'est le cas), ou lorsque vous êtes réellement à l'intérieur d'un filtre (lorsque l'être invoquée servlet n'est pas nécessairement déterminé encore, getPathInfo() pourrait revenir null), alors votre meilleur pari est de sous-chaîne de l'URI de la demande vous-même basé sur le chemin de contexte de la longueur à l'aide de l'habituel String méthode:

HttpServletRequest request = (HttpServletRequest) req;
String path = request.getRequestURI().substring(request.getContextPath().length());
// ...

80voto

fforw Points 2548
request.getRequestURI().substring(request.getContextPath().length())

38voto

James Points 1936

Avec le printemps, vous pouvez faire:

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

15voto

smas Points 8299

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 au contexte 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());
    ...

}
 

9voto

thetoolman Points 996

Si vous utilisez de la demande.getPathInfo() à l'intérieur d'un Filtre, vous semblez toujours obtenir la valeur null (au moins avec jetty).

Cette laconique invalide bug + réponse fait allusion à la question je pense:

https://issues.apache.org/bugzilla/show_bug.cgi?id=28323

Je soupçonne que c'est lié au fait que les filtres avant d'exécuter la servlet reçoit la demande. Il peut être un conteneur de bug, ou à un comportement attendu que je n'ai pas pu identifier.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X