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

Kor*_*tor 85 url spring-mvc httprequest

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

澄清:如果可能,我想退出使用HttpServletRequest对象.

Daf*_*aff 102

那么有两种方法可以更容易地访问这些数据,但是接口不提供通过一次调用获取整个URL的可能性.你必须手动构建它:

public static String makeUrl(HttpServletRequest request)
{
    return request.getRequestURL().toString() + "?" + request.getQueryString();
}
Run Code Online (Sandbox Code Playgroud)

我不知道如何使用任何Spring MVC工具执行此操作.

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

<listener>
    <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>
Run Code Online (Sandbox Code Playgroud)

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

((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest()
Run Code Online (Sandbox Code Playgroud)


Kor*_*tor 65

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

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

它们RequestContextHolder在底层使用,但提供了额外的灵活性,可以使用它们的功能构建新的URL UriComponentsBuilder.

例:

ServletUriComponentsBuilder builder = ServletUriComponentsBuilder.fromCurrentRequestUri();
builder.scheme("https");
builder.replaceQueryParam("someBoolean", false);
URI newUri = builder.build().toUri();
Run Code Online (Sandbox Code Playgroud)

  • 从Spring 3.1开始应该是公认的答案 (2认同)
  • 也适用于Spring 5.我已经设法使用`ServletUriComponentsBuilder.fromCurrentRequestUri().toUriString();`来获取`ConstraintValidator`中的URL. (2认同)

小智 16

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();
}
Run Code Online (Sandbox Code Playgroud)


小智 8

在jsp文件中:

request.getAttribute("javax.servlet.forward.request_uri")
Run Code Online (Sandbox Code Playgroud)


Mat*_*nkt 5

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

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

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

另见UriComponentsBuilderMethodArgumentResolver

  • 请注意,注入的“UriComponentsBuilder”不包含请求的路径和查询参数。如果您需要访问这些,请使用“ServletUriComponentsBuilder.fromCurrentRequest()”或注入“HttpServletRequest”的实例并使用“ServletUriComponentsBuilder.fromRequest(request)” (3认同)