2009-09-29 5 views
56

Ich möchte URLs basierend auf der URL erstellen, die vom Client für die aktive Anfrage verwendet wird. Gibt es etwas schlauer als die aktuellen Objekt und es ist getParameter...() Methoden, um die vollständige URL einschließlich (und nur) es ist GET-Parameter neu zu erstellen.Was ist der beste Weg, um die aktuelle URL in Spring MVC zu erhalten?

Erläuterung: Wenn möglich, möchte ich von der Verwendung eines HttpServletRequest Objekts zurücktreten.

Antwort

80

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 zu erhalten. Sie haben es zu bauen manuell:

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

Ich weiß nicht, über eine Möglichkeit, dies mit allen möglichen Spring MVC Einrichtungen zu tun.

Wenn Sie die aktuelle Anfrage zugreifen möchten, ohne es überall vorbei erhalten Sie einen Zuhörer in der web.xml hinzufügen:

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

Und dann diese verwenden, um die Anforderung an den aktuellen Thread gebunden zu bekommen:

((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest() 
+0

Ok, das ist ein ähnlicher Ansatz zu dem, was ich bisher gemacht habe. Aber ich suche nach einer Möglichkeit, dies zu tun, ohne das 'HttpServletRequest'-Objekt zu verwenden. Dies liegt daran, dass ich mehrere Hilfsklassen/-methoden verwende und das Anforderungsobjekt nicht jedes Mal übergeben möchte. – Koraktor

+0

Ok, ich weiß, was du meinst und fügte die Informationen hinzu, die du brauchst, um auf die aktuelle Anfrage zuzugreifen, ohne sie herumzugeben. – Daff

+0

Danke für die Erinnerung an den Hörer. Ich bin immer noch neu in Spring (und Java Web-Entwicklung im Allgemeinen). Ich verwende Ihren Code jetzt in Kombination mit "UrlUtils" von Spring Security. Klappt wunderbar. – Koraktor

8

in jsp-Datei:

request.getAttribute("javax.servlet.forward.request_uri") 
12

Java URI-Klasse können Sie helfen aus diesem:

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(); 
} 
+0

es gibt Hostnamen nur – Vivek

25

Statt RequestContextHolder direkt zu verwenden, können Sie auch ServletUriComponentsBuilder und seine statische Methoden verwenden:

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

Sie verwenden RequestContextHolder unter der Haube, bieten aber zusätzliche Flexibilität zum Erstellen neuer URLs mit den Funktionen UriComponentsBuilder.

Beispiel:

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

Danke, das war die hilfreichste Antwort für mich. – John

+0

Sollte die angenommene Antwort ab Frühjahr 3.1 – m4rtin

+0

@ m4rtin sein Ich beantwortete meine eigene Frage und wollte nicht den Kredit für denjenigen nehmen, der mir anfangs half, mein Problem zu lösen. – Koraktor