在Spring MVC中获取当前URL的最佳方法是什么?

时间:2009-09-29 06:08:44

标签: url spring-mvc httprequest

我想根据客户端为活动请求使用的URL创建URL。有没有比采用当前HttpServletRequest对象及其getParameter...()方法更聪明的方法来重建完整的URL,包括(并且只有)它的GET参数。

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

7 个答案:

答案 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,例如修改路径段。

另见UriComponentsBuilderMethodArgumentResolver

答案 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());

我用过。希望有用。