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