我想基于客户端用于活动请求的URL创建URL。还有什么比采用当前HttpServletRequest
对象更聪明的getParameter...()
方法吗?它是重建完整URL 的方法,包括(仅)GET参数。
澄清:如果可能的话,我想退出使用一个HttpServletRequest
对象。
Answers:
好了,有两种方法可以更轻松地访问此数据,但是该接口无法通过一个调用来获取整个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()
UrlUtils
。奇迹般有效。
除了RequestContextHolder
直接使用之外,还可以使用ServletUriComponentsBuilder
及其静态方法:
ServletUriComponentsBuilder.fromCurrentContextPath()
ServletUriComponentsBuilder.fromCurrentServletMapping()
ServletUriComponentsBuilder.fromCurrentRequestUri()
ServletUriComponentsBuilder.fromCurrentRequest()
它们RequestContextHolder
在幕后使用,但使用以下功能提供了额外的灵活性来构建新的URLUriComponentsBuilder
。
例:
ServletUriComponentsBuilder builder = ServletUriComponentsBuilder.fromCurrentRequestUri();
builder.scheme("https");
builder.replaceQueryParam("someBoolean", false);
URI newUri = builder.build().toUri();
ConstraintValidator
with ServletUriComponentsBuilder.fromCurrentRequestUri().toUriString();
。
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();
}
您还可以将a添加UriComponentsBuilder
到控制器方法的方法签名中。Spring将注入根据当前请求创建的构建器的实例。
@GetMapping
public ResponseEntity<MyResponse> doSomething(UriComponentsBuilder uriComponentsBuilder) {
URI someNewUriBasedOnCurrentRequest = uriComponentsBuilder
.replacePath(null)
.replaceQuery(null)
.pathSegment("some", "new", "path")
.build().toUri();
//...
}
使用构建器,您可以根据当前请求直接开始创建URI,例如,修改路径段。
UriComponentsBuilder
不包含请求的路径和查询参数。如果您需要访问使用ServletUriComponentsBuilder.fromCurrentRequest()
或注入实例的用户HttpServletRequest
,请使用ServletUriComponentsBuilder.fromRequest(request)
如果您需要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
HttpServletRequest
对象的方法。这是因为我正在使用几个帮助程序类/方法,并且我不想每次都传递请求对象。