2009-09-29 25 views
56

Me gustaría crear URL en función de la URL utilizada por el cliente para la solicitud activa. ¿Hay algo más inteligente que tomar el objeto actual HttpServletRequest y sus métodos getParameter...() para reconstruir la URL completa incluyendo (y solo) sus parámetros GET.¿Cuál es la mejor manera de obtener la URL actual en Spring MVC?

aclaración: Si es posible, quiero renunciar al uso de un objeto HttpServletRequest.

Respuesta

80

Bien, hay dos métodos para acceder a estos datos más fácilmente, pero la interfaz no ofrece la posibilidad de obtener toda la URL con una sola llamada. Usted tiene que construir de forma manual:

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

que no saben de una manera de hacer esto con las instalaciones Spring MVC.

Si desea acceder a la solicitud actual, sin pasar por todas partes, tendrá que añadir un detector en el web.xml:

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

y luego usar esto para obtener la solicitud unido al hilo actual:

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

Ok, este es un enfoque similar a lo que he hecho hasta ahora. Pero estoy buscando una forma de hacer esto sin utilizar el objeto 'HttpServletRequest'. Esto es porque estoy usando varias clases/métodos auxiliares y no quiero pasar el objeto de solicitud todo el tiempo. – Koraktor

+0

Ok, sé a qué te refieres y agregaste la información que necesitas para acceder a la solicitud actual sin pasarla por alto. – Daff

+0

Gracias por el recordatorio sobre el oyente. Todavía soy nuevo en Spring (y en el desarrollo web Java en general). Ahora estoy usando tu código en combinación con 'UrlUtils' de Spring Security. Funciona de maravilla. – Koraktor

8

en el archivo jsp:

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

clase URI de Java puede ayudarle fuera de esto:

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

dando el nombre de host solo – Vivek

25

En lugar de utilizar RequestContextHolder directamente, también se puede utilizar ServletUriComponentsBuilder y sus métodos estáticos:

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

Utilizan RequestContextHolder bajo el capó, pero proporcionan flexibilidad adicional para construir nuevas URL utilizando las capacidades de UriComponentsBuilder.

Ejemplo:

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

Gracias, esta fue la respuesta más útil para mí. – John

+0

Debe ser la respuesta aceptada a partir de Spring 3.1 – m4rtin

+0

@ m4rtin Respondí a mi propia pregunta y no quería tomar el crédito por el que inicialmente me ayudó a resolver mi problema. – Koraktor

Cuestiones relacionadas