web-dev-qa-db-fra.com

Quel est le meilleur moyen d'obtenir l'URL actuelle dans Spring MVC?

J'aimerais créer des URL basées sur l'URL utilisée par le client pour la demande active. Y a-t-il quelque chose de plus intelligent que de prendre l'objet HttpServletRequest actuel et ses méthodes getParameter...() pour reconstruire l'URL complète, y compris (et uniquement) ses paramètres GET.

Clarification: Si possible, je veux renoncer à utiliser un objet HttpServletRequest.

74
Koraktor

Il existe bien deux méthodes pour accéder plus facilement à ces données, mais l'interface n'offre pas la possibilité d'obtenir l'URL complète en un seul appel. Vous devez le construire manuellement:

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

Je ne sais pas comment il est possible de faire cela avec n'importe quelle installation Spring MVC.

Si vous souhaitez accéder à la demande en cours sans la transmettre partout, vous devrez ajouter un écouteur dans le fichier web.xml:

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

Et utilisez ensuite ceci pour obtenir la demande liée au thread actuel:

((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest()
91
Daff

Java URI Class 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();
}
15
Reed Grey

en fichier jsp:

request.getAttribute("javax.servlet.forward.request_uri")
8
andy

Vous pouvez également ajouter une UriComponentsBuilder à la signature de méthode de votre méthode de contrôleur. Spring injectera une instance du générateur créée à partir de la demande en cours.

@GetMapping
public ResponseEntity<MyResponse> doSomething(UriComponentsBuilder uriComponentsBuilder) {
    URI someNewUriBasedOnCurrentRequest = uriComponentsBuilder
            .replacePath(null)
            .replaceQuery(null)
            .pathSegment("some", "new", "path")
            .build().toUri();
  //...
}

En utilisant le générateur, vous pouvez directement créer des URI en fonction de la requête en cours, par exemple. modifier les segments de chemin.

Voir aussi UriComponentsBuilderMethodArgumentResolver

1
Mathias Dpunkt

Si vous avez besoin de l'URL jusqu'au nom d'hôte et non du chemin, utilisez Common Lib StringUtil d'Apache et extrayez 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 https://example.com/path/after/url/, alors Output sera https://example.com

0
Sahil Chhabra