代码之家  ›  专栏  ›  技术社区  ›  Koraktor

在SpringMVC中获取当前URL的最佳方法是什么?

  •  74
  • Koraktor  · 技术社区  · 15 年前

    我想基于客户端用于活动请求的URL创建URL。有什么比接受电流更聪明的吗 HttpServletRequest 对象及其 getParameter...() 方法重建完整的URL,包括(并且仅限于)它的get参数。

    澄清:如果可能,我想辞去使用 httpservletrequest(httpservletrequest) 对象。

    6 回复  |  直到 6 年前
        1
  •  91
  •   Rasmus Faber    10 年前

    好吧,有两种方法可以更容易地访问这些数据,但是界面不提供通过一次调用获取整个URL的可能性。您必须手动构建它:

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

    我不知道如何用任何SpringMVC设备来实现这一点。

    如果要访问当前请求而不将其传递到任何地方,则必须在web.xml中添加侦听器:

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

    然后使用它将请求绑定到当前线程:

    ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest()
    
        2
  •  50
  •   Koraktor    7 年前

    而不是使用 RequestContextHolder 直接,您也可以使用 ServletUriComponentsBuilder 及其静态方法:

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

    他们使用 请求上下文所有者 但提供了额外的灵活性,可以使用 UriComponentsBuilder .

    例子:

    ServletUriComponentsBuilder builder = ServletUriComponentsBuilder.fromCurrentRequestUri();
    builder.scheme("https");
    builder.replaceQueryParam("someBoolean", false);
    URI newUri = builder.build().toUri();
    
        3
  •  15
  •   René Vogt    9 年前

    Java的URI类可以帮助你摆脱这个问题:

    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();
    }
    
        4
  •  8
  •   Soner Gönül to StackOverflow    12 年前

    在JSP文件中:

    request.getAttribute("javax.servlet.forward.request_uri")
    
        5
  •  1
  •   Mathias Dpunkt    7 年前

    您还可以添加 UriComponentsBuilder 到控制器方法的方法签名。Spring将注入从当前请求创建的生成器实例。

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

    使用生成器,您可以根据当前请求直接开始创建URI,例如修改路径段。

    也见 UriComponentsBuilderMethodArgumentResolver

        6
  •  0
  •   Sahil Chhabra    7 年前

    如果在主机名之前需要URL,而不是路径,请使用Apache的公共lib StringUtil ,并从url提取子字符串,直到第三个indexof / .

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

    例子: 如果 全网址 https://example.com/path/after/url/ 然后 产量 https://example.com