wake-up-neo.net

Was ist der beste Weg, um die aktuelle URL in Spring MVC zu erhalten?

Ich möchte URLs basierend auf der vom Client für die aktive Anfrage verwendeten URL erstellen. Ist es etwas intelligenter, als das aktuelle HttpServletRequest-Objekt und die getParameter...()-Methoden zu verwenden, um die vollständige URL einschließlich (und nur) ihrer GET-Parameter neu zu erstellen.

Klarstellung: Wenn möglich, möchte ich von einem HttpServletRequest-Objekt zurücktreten.

74
Koraktor

Nun, es gibt zwei Methoden, um auf diese Daten einfacher zuzugreifen, aber die Schnittstelle bietet nicht die Möglichkeit, die gesamte URL mit einem Aufruf abzurufen. Sie müssen es manuell erstellen:

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

Ich kenne keine Möglichkeit, dies mit Spring MVC-Einrichtungen zu tun.

Wenn Sie auf die aktuelle Anforderung zugreifen möchten, ohne sie überall zu übergeben, müssen Sie in der web.xml einen Listener hinzufügen:

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

Und dann verwenden Sie dies, um die Anfrage an den aktuellen Thread zu binden:

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

Anstatt RequestContextHolder direkt zu verwenden, können Sie auch ServletUriComponentsBuilder und seine statischen Methoden verwenden:

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

Sie verwenden RequestContextHolder unter der Haube, bieten jedoch zusätzliche Flexibilität, um mithilfe der Funktionen von UriComponentsBuilder neue URLs zu erstellen.

Beispiel:

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

Die Java URI-Klasse kann Ihnen dabei helfen:

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

in jsp datei:

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

Sie können der Methodensignatur Ihrer Controller-Methode auch eine UriComponentsBuilder hinzufügen. Spring fügt eine Instanz des Builders ein, der aus der aktuellen Anforderung erstellt wurde.

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

Mit dem Builder können Sie direkt mit der Erstellung von URIs auf der Grundlage der aktuellen Anforderung beginnen, z. Pfadsegmente ändern.

Siehe auch UriComponentsBuilderMethodArgumentResolver

1
Mathias Dpunkt

Wenn Sie die URL bis zum Hostnamen und nicht den Pfad benötigen, verwenden Sie die Common Lib StringUtil von Apache und extrahieren Sie von der URL die Teilzeichenfolge bis zum dritten indexOf /.

public static String getURL(HttpServletRequest request){
   String fullURL = request.getRequestURL().toString();
   return fullURL.substring(0,StringUtils.ordinalIndexOf(fullURL, "/", 3)); 
}

Beispiel: Wenn fullURLhttps://example.com/path/after/url/ ist, dann Ausgabe wird https://example.com

0
Sahil Chhabra