我想创建一个基于为活动请求客户端使用的URL网址。 有什么比以当前聪明HttpServletRequest
对象和它getParameter...()
方法来重建完整的URL包括(只)这是GET参数。
澄清:如果可能的话我想从使用辞职HttpServletRequest
对象。
我想创建一个基于为活动请求客户端使用的URL网址。 有什么比以当前聪明HttpServletRequest
对象和它getParameter...()
方法来重建完整的URL包括(只)这是GET参数。
澄清:如果可能的话我想从使用辞职HttpServletRequest
对象。
那么有两种方法可以更轻松地访问这些数据,但界面不提供的可能性有一个调用来获取整个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()
而不是使用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();
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();
}
在JSP文件:
request.getAttribute("javax.servlet.forward.request_uri")
您还可以添加一个UriComponentsBuilder
到控制器方法的方法签名。 Spring会注入当前请求创建的建设者的一个实例。
@GetMapping
public ResponseEntity<MyResponse> doSomething(UriComponentsBuilder uriComponentsBuilder) {
URI someNewUriBasedOnCurrentRequest = uriComponentsBuilder
.replacePath(null)
.replaceQuery(null)
.pathSegment("some", "new", "path")
.build().toUri();
//...
}
使用生成器就可以直接开始创建修改路径段基于当前请求的URI如。
又见UriComponentsBuilderMethodArgumentResolver
如果您需要的网址,直到主机名,而不是路径使用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