什么是让Spring MVC中当前的URL的最佳方式?(What's the best wa

2019-07-20 00:39发布

我想创建一个基于为活动请求客户端使用的URL网址。 有什么比以当前聪明HttpServletRequest对象和它getParameter...()方法来重建完整的URL包括(只)这是GET参数。

澄清:如果可能的话我想从使用辞职HttpServletRequest对象。

Answer 1:

那么有两种方法可以更轻松地访问这些数据,但界面不提供的可能性有一个调用来获取整个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()


Answer 2:

而不是使用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();


Answer 3:

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


Answer 4:

在JSP文件:

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


Answer 5:

您还可以添加一个UriComponentsBuilder到控制器方法的方法签名。 Spring会注入当前请求创建的建设者的一个实例。

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

使用生成器就可以直接开始创建修改路径段基于当前请求的URI如。

又见UriComponentsBuilderMethodArgumentResolver



Answer 6:

如果您需要的网址,直到主机名,而不是路径使用Apache的通用库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



文章来源: What's the best way to get the current URL in Spring MVC?