2009-09-29 4 views
56

J'aimerais créer des URL en fonction de l'URL utilisée par le client pour la demande active. Y at-il quelque chose de plus intelligent que de prendre l'objet actuel HttpServletRequest et getParameter...() méthodes pour reconstruire l'URL complète, y compris (et seulement) ses paramètres GET.Quelle est la meilleure façon d'obtenir l'URL actuelle dans Spring MVC?

Clarification: Si possible, je souhaite me désabonner de l'utilisation d'un objet HttpServletRequest.

Répondre

80

Eh bien, il existe deux méthodes pour accéder à ces données plus facilement, mais l'interface n'offre pas la possibilité d'obtenir l'ensemble de l'URL avec un appel. Vous devez construire manuellement:

public static String makeUrl(HttpServletRequest request) 
{ 
    return request.getRequestURL().toString() + "?" + request.getQueryString(); 
} 

Je ne sais pas d'une façon de le faire avec toutes les installations Spring MVC.

Si vous souhaitez accéder à la demande actuelle sans passer partout où vous devrez ajouter un écouteur dans le web.xml:

<listener> 
    <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class> 
</listener> 

Et puis utilisez ceci pour obtenir la demande liée à la discussion actuelle:

((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest() 
+0

Ok, cette approche est similaire à ce que je l'ai fait jusqu'à présent. Mais je cherche un moyen de le faire sans réellement utiliser l'objet 'HttpServletRequest'. C'est parce que j'utilise plusieurs classes/méthodes auxiliaires et je ne veux pas passer l'objet de requête à chaque fois. – Koraktor

+0

Ok, je sais ce que vous voulez dire et j'ai ajouté les informations dont vous avez besoin pour accéder à la requête en cours sans la faire circuler. – Daff

+0

Merci pour le rappel à propos de l'auditeur. Je suis encore nouveau sur Spring (et le développement web Java en général). J'utilise maintenant votre code en combinaison avec 'UrlUtils' de Spring Security. Fonctionne comme un charme. – Koraktor

8

dans le fichier jsp:

request.getAttribute("javax.servlet.forward.request_uri") 
12

URI classe Java peut vous aider sur ceci:

public static String getCurrentUrl(HttpServletRequest request){ 
    URL url = new URL(request.getRequestURL().toString()); 
    String host = url.getHost(); 
    String userInfo = url.getUserInfo(); 
    String scheme = url.getProtocol(); 
    String port = url.getPort(); 
    String path = request.getAttribute("javax.servlet.forward.request_uri"); 
    String query = request.getAttribute("javax.servlet.forward.query_string"); 

    URI uri = new URI(scheme,userInfo,host,port,path,query,null) 
    return uri.toString(); 
} 
+0

son nom d'hôte donnant seulement – Vivek

25

Au lieu d'utiliser directement RequestContextHolder, vous pouvez également utiliser ServletUriComponentsBuilder et ses méthodes statiques:

  • ServletUriComponentsBuilder.fromCurrentContextPath()
  • ServletUriComponentsBuilder.fromCurrentServletMapping()
  • ServletUriComponentsBuilder.fromCurrentRequestUri()
  • ServletUriComponentsBuilder.fromCurrentRequest()

Ils utilisent RequestContextHolder sous le capot, mais offrent une flexibilité supplémentaire pour construire de nouvelles URL en utilisant les capacités de UriComponentsBuilder.

Exemple:

ServletUriComponentsBuilder builder = ServletUriComponentsBuilder.fromCurrentRequestUri(); 
builder.scheme("https"); 
builder.replaceQueryParam("someBoolean", false); 
URI newUri = builder.build().toUri(); 
+0

Merci, c'était la réponse la plus utile pour moi. – John

+0

Devrait être la réponse acceptée à partir du printemps 3.1 – m4rtin

+0

@ m4rtin J'ai répondu à ma propre question et je ne voulais pas prendre le crédit pour celui qui m'a aidé à résoudre mon problème. – Koraktor

Questions connexes