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

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

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

那么有两种方法可以更容易地访问这些数据,但是这个接口并不能提供一次调用整个URL的可能性。 你必须手动build立它:

 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() 

而不是直接使用ServletUriComponentsBuilder ,你也可以使用ServletUriComponentsBuilder及其静态方法:

  • ServletUriComponentsBuilder.fromCurrentContextPath()
  • ServletUriComponentsBuilder.fromCurrentServletMapping()
  • ServletUriComponentsBuilder.fromCurrentRequestUri()
  • ServletUriComponentsBuilder.fromCurrentRequest()

他们在UriComponentsBuilder使用了UriComponentsBuilder ,但是使用UriComponentsBuilder的function提供了额外的灵活性来构build新的URL。

例:

 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")