什么是最好的方式获得的目前的网址在弹簧视?
-
18-09-2019 - |
题
我想创建网址的网址使用的客户的活动的请求。有什么聪明不是采取目前的 HttpServletRequest
对象和它的 getParameter...()
方法到重建完整的网址,包括(并且只有),它获得的参数。
澄清:如果可能的我要辞职从使用 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
发动机罩下,但提供额外的灵活性以建立新的网址使用的能力 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
该方法的签名你的控制器的方法。春季会注的一个实例建造者创建的,从目前的请求。
@GetMapping
public ResponseEntity<MyResponse> doSomething(UriComponentsBuilder uriComponentsBuilder) {
URI someNewUriBasedOnCurrentRequest = uriComponentsBuilder
.replacePath(null)
.replaceQuery(null)
.pathSegment("some", "new", "path")
.build().toUri();
//...
}
使用建设者你可以直接开始创建Uri根据当前的请求,例如修改路段。
如果您需要的网址,直到主机名,而不是路径使用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
不隶属于 StackOverflow