Pergunta

Eu gostaria de criar URLs com base na URL usado pelo cliente para o pedido ativo. Existe alguma coisa mais inteligente do que tomar o objeto HttpServletRequest atual e seus métodos getParameter...() para reconstruir o URL completo, incluindo (e única) é parâmetros GET.

Esclarecimento:. Se possível eu quero renunciar ao uso de um objeto HttpServletRequest

Foi útil?

Solução

Bem, existem dois métodos para acesso mais fácil estes dados, mas a interface não oferece a possibilidade de obter toda a URL com uma chamada. Você tem que construí-lo manualmente:

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

Eu não sei sobre a maneira de fazer isso com quaisquer instalações Spring MVC.

Se você quiser acessar a solicitação atual sem passá-la em todos os lugares que você terá que adicionar um ouvinte no web.xml:

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

E, em seguida, usar isso para obter a solicitação ligado ao thread atual:

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

Outras dicas

Em vez de usar RequestContextHolder diretamente, você pode também usar ServletUriComponentsBuilder e seus métodos estáticos:

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

Eles usam RequestContextHolder sob o capô, mas fornecem flexibilidade adicional para construir novas URLs usando as capacidades de UriComponentsBuilder.

Exemplo:

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

URI classe de Java pode ajudá-lo fora deste:

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

no arquivo JSP:

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

Você também pode adicionar um UriComponentsBuilder para a assinatura do método do seu método de controlador. Primavera vai injetar uma instância do construtor criado a partir da solicitação atual.

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

Usando o construtor você pode iniciar diretamente a criação de URIs com base na solicitação atual, por exemplo, modificar segmentos de caminho.

Veja também UriComponentsBuilderMethodArgumentResolver

Se você precisa do URL até hostname e não o uso caminho Lib Comum StringUtil do Apache, e de URL extrair o substring até terceiro / indexOf.

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

Exemplo: Se fullurl é https://example.com/path/after/url/ seguida saída será https://example.com

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top