我想根据客户端为活动请求使用的URL创建URL。有没有比采用当前HttpServletRequest
对象及其getParameter...()
方法更聪明的方法来重建完整的URL,包括(并且只有)它的GET参数。
澄清:如果可能,我想退出使用HttpServletRequest
对象。
答案 0 :(得分:95)
有两种方法可以更轻松地访问这些数据,但是界面不提供通过一次调用获取整个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>
然后使用它来获取绑定到当前Thread的请求:
((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest()
答案 1 :(得分:59)
您可以使用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();
答案 2 :(得分:16)
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();
}
答案 3 :(得分:8)
在jsp文件中:
request.getAttribute("javax.servlet.forward.request_uri")
答案 4 :(得分:2)
您还可以在控制器方法的方法签名中添加if(jobs.Count > number) do
。 Spring将注入从当前请求创建的构建器实例。
UriComponentsBuilder
使用构建器,您可以根据当前请求直接开始创建URI,例如修改路径段。
答案 5 :(得分:0)
如果您需要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
答案 6 :(得分:0)
System.out.println(((HttpServletRequest)request).getRequestURI());
我用过。希望有用。