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

我希望根据客户端用于活动请求的 URL 创建 URL。还有什么比使用当前的 HttpServletRequest对象和它的 getParameter...()方法重新构建包含(而且只包含)它的 GET 参数的完整 URL 更聪明的方法吗。

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

207184 次浏览

Well there are two methods to access this data easier, but the interface doesn't offer the possibility to get the whole URL with one call. You have to build it manually:

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>

然后使用这个函数将请求绑定到当前 Thread:

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

在 jsp 文件中:

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

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

除了直接使用 RequestContextHolder,你也可以使用 ServletUriComponentsBuilder及其静态方法:

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

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

Example:

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

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

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

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

参见 参数解析器

If you need the URL till hostname and not the path use Apache's Common Lib StringUtil, and from URL extract the substring till third 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

Println (((HttpServletRequest) request) . getRequestURI ()) ;

我用过了,希望有用。