Qual è il modo migliore per ottenere l’URL corrente in Spring MVC?

Mi piacerebbe creare URL in base all’URL utilizzato dal client per la richiesta triggers. C’è qualcosa di più intelligente che prendere l’attuale object HttpServletRequest ed è getParameter...() metodi per ribuild l’URL completo inclusi (e solo) i suoi parametri GET.

Chiarimento: se ansible, desidero rassegnare le dimissioni dall’utilizzo di un object HttpServletRequest .

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 sola chiamata. Devi costruirlo manualmente:

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

Non conosco un modo per farlo con le strutture di Spring MVC.

Se vuoi accedere alla Richiesta corrente senza passarla ovunque, dovrai aggiungere un listener nel web.xml:

  org.springframework.web.context.request.RequestContextListener  

E quindi usa questo per ottenere la richiesta vincasting al thread corrente:

 ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest() 

Invece di usare direttamente RequestContextHolder , puoi anche usare ServletUriComponentsBuilder e i suoi metodi statici:

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

Utilizzano RequestContextHolder sotto il cofano, ma forniscono 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(); 

La class URI di Java può aiutarti a 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(); } 

nel file jsp:

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

È anche ansible aggiungere un UriComponentsBuilder alla firma del metodo del metodo del controller. Spring inietterà un’istanza del builder creata dalla richiesta corrente.

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

Utilizzando il builder è ansible iniziare direttamente a creare URI in base alla richiesta corrente, ad esempio modificare i segmenti del percorso.

Vedi anche UriComponentsBuilderMethodArgumentResolver

Se hai bisogno dell’URL fino a hostname e non del percorso usa Common Lib StringUtil di Apache, e dall’URL estrai la sottostringa fino a third indexOf / .

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

Esempio: se fullURL è https://example.com/path/after/url/ output sarà https://example.com