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