113

我想根据客户端用于活动请求的 URL 创建 URL。有什么比获取当前HttpServletRequest对象更聪明的getParameter...()方法,它是重建完整 URL 的方法,包括(且仅)它的 GET 参数。

澄清:如果可能的话,我想放弃使用一个HttpServletRequest对象。

4

7 回答 7

125

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

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

我不知道如何使用任何 Spring MVC 设施来做到这一点。

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

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

然后使用它来获取绑定到当前线程的请求:

((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest()
于 2009-09-29T06:58:24.800 回答
103

除了RequestContextHolder直接使用之外,您还可以使用ServletUriComponentsBuilder及其静态方法:

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

它们RequestContextHolder在后台使用,但提供了额外的灵活性来使用UriComponentsBuilder.

例子:

ServletUriComponentsBuilder builder = ServletUriComponentsBuilder.fromCurrentRequestUri();
builder.scheme("https");
builder.replaceQueryParam("someBoolean", false);
URI newUri = builder.build().toUri();
于 2017-03-07T13:58:21.273 回答
19

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();
}
于 2015-04-13T08:51:17.540 回答
8

在jsp文件中:

request.getAttribute("javax.servlet.forward.request_uri")
于 2013-03-18T08:12:24.717 回答
5

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

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

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

另请参见UriComponentsBuilderMethodArgumentResolver

于 2018-03-27T13:22:37.893 回答
0

如果您需要 URL 直到主机名而不是路径,请使用 Apache 的 Common Lib StringUtil,并从 URL 中提取子字符串直到第三个 indexOf /

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

示例:如果fullURL是,https://example.com/path/after/url/输出将是 https://example.com

于 2018-03-28T04:00:10.057 回答
0

System.out.println(((HttpServletRequest)request).getRequestURI());

我用过。希望它有用。

于 2021-05-26T01:34:46.693 回答