Me gustaría crear URLs basado en la dirección URL utilizada por el cliente para la solicitud activa. No hay nada más inteligente que toma el actual HttpServletRequest objeto y getParameter...() métodos para reconstruir la dirección URL completa, incluyendo (y único) es OBTENER parámetros.

Aclaración: Si es posible quiero renunciar a usar un HttpServletRequest objeto.

InformationsquelleAutor Koraktor | 2009-09-29

6 Comentarios

  1. 98

    Bueno, hay dos métodos de acceder a estos datos más fácil, pero la interfaz no ofrece la posibilidad de obtener la URL completa con una llamada. Usted tiene que construir manualmente:

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

    No sé acerca de una forma de hacer esto con cualquier MVC de Spring instalaciones.

    Si quieres acceder a la Solicitud actual sin pasar en todas partes se le tiene que agregar una escucha en la web.xml:

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

    Y, a continuación, utilizar esto para obtener la solicitud unido a la actual Subproceso:

    ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest()
    • Ok, este es un enfoque similar a lo que he hecho hasta ahora. Pero estoy buscando una manera de hacer esto sin usar realmente la HttpServletRequest objeto. Esto es debido a que estoy usando varios ayudante de clases / métodos y no quiero pasar la solicitud objeto cada vez.
    • Ok, yo sé lo que quieres decir y añade la información que necesitas para acceder a la solicitud actual sin pasar por todo.
    • Gracias por el recordatorio sobre el oyente. Todavía soy nuevo en la Primavera (Java y desarrollo web en general). Ahora estoy usando el código en combinación con la Primavera a la Seguridad del UrlUtils. Funciona como un encanto.
    • En mi caso, me da la relacionada con la vista de la ruta de acceso en lugar de navegar a la url. Alguna idea sobre esto?
  2. 60

    Lugar de utilizar RequestContextHolder directamente, también 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 URLs usando las capacidades de UriComponentsBuilder.

    Ejemplo:

    ServletUriComponentsBuilder builder = ServletUriComponentsBuilder.fromCurrentRequestUri();
    builder.scheme("https");
    builder.replaceQueryParam("someBoolean", false);
    URI newUri = builder.build().toUri();
    • Muchas gracias, este fue el más útil respuesta para mí.
    • Debe ser aceptado como respuesta de la Primavera 3.1
    • Me respondió a mi pregunta y no quería tomar el crédito para el que inicialmente me ayudó a resolver mi problema.
    • También es bueno para la Primavera 5. Me las he arreglado para conseguir la URL dentro de un ConstraintValidator con ServletUriComponentsBuilder.fromCurrentRequestUri().toUriString();.
  3. 16

    Java de la Clase URI puede ayudar a salir de este:

    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();
    }
    • su nombre de host sólo
  4. 1

    También puede agregar un UriComponentsBuilder a la firma del método de su método de controlador. La primavera va a inyectar una instancia del generador creado a partir de la solicitud actual.

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

    Utilizando el generador puede iniciar directamente la creación de URIs basado en la petición actual por ejemplo, modificar los segmentos de la ruta.

    Ver también UriComponentsBuilderMethodArgumentresolver

  5. 0

    Si usted necesita la URL hasta el nombre de host y no la ruta de acceso de uso de Apache Común Lib StringUtil, y a partir de la URL de extraer la subcadena hasta el tercer indexOf /.

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

    Ejemplo: Si fullURL es https://example.com/path/after/url/, a continuación,
    Salida será https://example.com

Dejar respuesta

Please enter your comment!
Please enter your name here