Quelle est la meilleure façon d'obtenir l'URL actuelle dans Spring MVC?
-
18-09-2019 - |
Question
Je voudrais créer des URL en fonction de l'URL utilisée par le client pour la demande active. Y at-il plus intelligent que de prendre l'objet en cours HttpServletRequest
et il est des méthodes getParameter...()
de reconstruire l'URL complète, y compris (et seulement), il est GET paramètres.
Précision:. Si possible, je veux démissionner de l'aide d'un objet HttpServletRequest
La solution
Eh bien, il existe deux méthodes pour accéder à ces données plus facile, mais l'interface n'offre pas la possibilité d'obtenir l'URL entière avec un seul 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()
Autres conseils
Au lieu d'utiliser RequestContextHolder
directement, 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();
URI de classe Java peut vous aider à sortir de 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();
}
dans le fichier jsp:
request.getAttribute("javax.servlet.forward.request_uri")
Vous pouvez également ajouter un UriComponentsBuilder
à la signature de la méthode de votre méthode de commande. Le printemps va injecter une instance du constructeur créé à partir de la demande actuelle.
@GetMapping
public ResponseEntity<MyResponse> doSomething(UriComponentsBuilder uriComponentsBuilder) {
URI someNewUriBasedOnCurrentRequest = uriComponentsBuilder
.replacePath(null)
.replaceQuery(null)
.pathSegment("some", "new", "path")
.build().toUri();
//...
}
Utilisation du constructeur, vous pouvez directement commencer à créer des liens en fonction de la demande actuelle par exemple modifier segments de trajectoire.
Voir aussi UriComponentsBuilderMethodArgumentResolver
Si vous avez besoin de l'URL jusqu'à ce nom d'hôte et non le chemin utiliser le StringUtil
Common Lib Apache, et d'URL extraire la sous-chaîne jusqu'au troisième indexOf /
.
public static String getURL(HttpServletRequest request){
String fullURL = request.getRequestURL().toString();
return fullURL.substring(0,StringUtils.ordinalIndexOf(fullURL, "/", 3));
}
Exemple: Si fullurl est alors https://example.com/path/after/url/
Sortie sera https://example.com