2009-09-29 20 views
56

Mi piacerebbe creare URL in base all'URL utilizzato dal client per la richiesta attiva. C'è qualcosa di più intelligente che prendere l'attuale oggetto HttpServletRequest ed è i metodi getParameter...() per ricostruire l'URL completo inclusi (e solo) i suoi parametri GET.Qual è il modo migliore per ottenere l'URL corrente in Spring MVC?

Chiarimento: Se possibile, desidero rassegnare le dimissioni dall'uso di un oggetto HttpServletRequest.

risposta

80

Bene, ci sono due metodi per accedere a questi dati più facilmente, ma l'interfaccia non offre la possibilità di ottenere l'intero URL con una chiamata. Devi costruire manualmente:

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

non so di un modo per fare questo con eventuali strutture Spring MVC.

Se si desidera accedere alla corrente richiesta senza passare ovunque si dovrà aggiungere un ascoltatore nel web.xml:

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

E quindi utilizzare questo per ottenere la richiesta legato al thread corrente:

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

Ok, questo è un approccio simile a quello che ho fatto finora. Ma sto cercando un modo per farlo senza utilizzare effettivamente l'oggetto 'HttpServletRequest'. Questo perché sto usando diverse classi helper/metodi e non voglio passare l'oggetto richiesta ogni volta. – Koraktor

+0

Ok, so cosa intendi e ho aggiunto le informazioni necessarie per accedere alla richiesta corrente senza farla passare. – Daff

+0

Grazie per il promemoria sull'ascoltatore. Sono ancora nuovo di Spring (e lo sviluppo web Java in generale). Ora sto usando il tuo codice in combinazione con 'UrlUtils' di Spring Security. Funziona come un fascino. – Koraktor

8

nel file JSP:

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

URI classe Java può aiutare fuori da questo:

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

il suo nome host solo – Vivek

25

Invece di usare RequestContextHolder direttamente, è anche possibile utilizzare ServletUriComponentsBuilder ed i suoi metodi statici:

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

Utilizzano RequestContextHolder sotto il cofano, ma offrono ulteriore flessibilità per creare nuovi URL utilizzando le funzionalità di UriComponentsBuilder.

Esempio:

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

Grazie, questa è stata la risposta più utile per me. – John

+0

Dovrebbe essere la risposta accettata a partire dalla primavera 3.1 – m4rtin

+0

@ m4rtin Ho risposto alla mia domanda e non volevo prendere il merito di colui che inizialmente mi ha aiutato a risolvere il mio problema. – Koraktor

Problemi correlati