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