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
.
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()
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();
}
en fichier jsp:
request.getAttribute("javax.servlet.forward.request_uri")
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
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