2010-11-25 15 views
101

La méthode request.getRequestURI() renvoie l'URI avec le chemin de contexte.Comment obtenir l'URI de la requête sans le chemin du contexte?

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

Y a-t-il un moyen d'obtenir uniquement cette partie /secure/users, c'est-à-dire l'URI sans chemin de contexte?

+2

double possible de [Quelle est la différence entre les méthodes getRequestURI et getPathInfo dans HttpServletRequest?] (http://stackoverflow.com/questions/4931323/whats-the-difference-between-getrequesturi-and-getpathinfo-methods-in-httpservl) – Leonel

Répondre

124

Si vous êtes à l'intérieur d'une servlet contoller avant qui est mis en correspondance sur un modèle de préfixe , alors vous pouvez simplement utiliser HttpServletRequest#getPathInfo().

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

En supposant que le servlet dans votre exemple est mis en correspondance sur /secure, alors ce sera de retour /users qui serait l'information de seul intérêt dans un servlet contrôleur frontal typique. Si le servlet est toutefois mappé sur un modèle de suffixe (vos exemples d'URL n'indiquent cependant pas que c'est le cas), ou lorsque vous êtes réellement dans un filtre (lorsque le servlet à invoquer n'est pas nécessairement encore déterminé, donc getPathInfo() pourrait revenir null), alors votre meilleur pari est de sous-chaîne la demande URI vous en fonction de la longueur du chemin de contexte en utilisant la méthode String habituelle:

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

Y at-il une raison d'utiliser ceci à la place de 'getServletPath()'? J'écris un filtre et j'ai remarqué que 'getPathInfo()' renvoie 'null', mais' getServletPath() 'renvoie le chemin moins le contexte (approprié pour passer au répartiteur de demande). –

+0

@JasonC: En réponse, 'getPathInfo()' renvoie une valeur nulle si la servlet du contrôleur frontal n'est pas mappée sur un modèle de préfixe. – BalusC

+0

Ouais. Je voulais dire: y a-t-il une raison pour laquelle vous préférez getPathInfo sur getServletPath? Un grand nombre des autres réponses les mieux notées ici n'utilisent pas non plus getServletPath, ce qui me rend suspicieux et pourquoi je me pose la question. J'ai un projet de servlet sur lequel je travaille et j'essaie de peaufiner mes compétences. –

2

Une manière de faire est de faire reposer le chemin du contexte de servlet depuis l'URI de la requête.

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

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

Lecture here.

-1

Peut être vous pouvez simplement utiliser la méthode du partage pour éliminer le «/myapp » par exemple:

string[] uris=request.getRequestURI().split("/"); 
string uri="/"+uri[1]+"/"+uris[2]; 
+2

Cela posera un problème si je déploie mon application en tant que root et que son URL de base devient http: // localhost: 8080 /. Dans ce cas, request.getRequestURI() renverra "/ secure/user" et votre méthode split provoquera un problème ici. Le code ne doit pas dépendre du déploiement. – craftsman

60
request.getRequestURI().substring(request.getContextPath().length()) 
+0

Génial! Ceci est exactement ce que je cherchais. – craftsman

+4

+1 Je pense que c'est une meilleure réponse que getPathInfo en raison du fait que getPathInfo peut être null et d'autres bizarreries. Le code Spring divers fait getContextPath et le supprime de l'URI comme vous l'avez fait au lieu de getPathInfo. –

+2

Est-ce que cela fonctionnera ces servlets bebind un équilibreur de charge? –

11

getPathInfo() renvoient parfois nulle. Dans la documentation HttpServletRequest

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

J'ai besoin d'obtenir le chemin d'accès au fichier sans le chemin du contexte dans Filter et getPathInfo() me renvoie null. Donc j'utilise 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()); 
    ... 

} 
4

Si vous utilisez request.getPathInfo() dans un filtre, vous semblez toujours obtenir nulle (au moins avec une jetée).

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

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

je soupçonne qu'il est lié au fait que des filtres exécuté avant le servlet reçoit la demande. Il peut s'agir d'un bug de conteneur ou d'un comportement attendu que je n'ai pas pu identifier.

Le contextePath 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é ou

19

Avec Spring vous pouvez faire:

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

Bien sûr, il serait logique de conserver une instance de UrlPathHelper, par exemple. en tant que variable membre de classe ... – James