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

Était-ce utile?

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top