我想根据活动请求客户端使用的URL来创建URL。有没有什么比采取当前的HttpServletRequest
对象和它的getParameter...()
方法更聪明的方法来重建完整的URL,包括(也是唯一的)它的GET参数。在Spring MVC中获取当前URL的最佳方式是什么?
说明:如果可能,我想从使用HttpServletRequest
对象辞职。
我想根据活动请求客户端使用的URL来创建URL。有没有什么比采取当前的HttpServletRequest
对象和它的getParameter...()
方法更聪明的方法来重建完整的URL,包括(也是唯一的)它的GET参数。在Spring MVC中获取当前URL的最佳方式是什么?
说明:如果可能,我想从使用HttpServletRequest
对象辞职。
那么有两种方法可以更容易地访问这些数据,但该接口不提供一次调用就可以获得整个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>
然后用它来获取绑定到当前线程的要求:
((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest()
:
request.getAttribute("javax.servlet.forward.request_uri")
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();
}
仅给出主机名称 – Vivek 2015-07-05 07:19:31
,而不是直接使用RequestContextHolder
,你也可以使用ServletUriComponentsBuilder
和它的静态方法:
ServletUriComponentsBuilder.fromCurrentContextPath()
ServletUriComponentsBuilder.fromCurrentServletMapping()
ServletUriComponentsBuilder.fromCurrentRequestUri()
ServletUriComponentsBuilder.fromCurrentRequest()
它们在底层使用RequestContextHolder
,但使用UriComponentsBuilder
的功能提供了更多的灵活性来构建新的URL。
例子:
ServletUriComponentsBuilder builder = ServletUriComponentsBuilder.fromCurrentRequestUri();
builder.scheme("https");
builder.replaceQueryParam("someBoolean", false);
URI newUri = builder.build().toUri();
好吧,这是一个类似的方法我到目前为止已经完成。但是我正在寻找一种方法来做到这一点,而不用实际使用'HttpServletRequest'对象。这是因为我使用了多个助手类/方法,而且我不想每次都传递请求对象。 – Koraktor 2009-09-29 07:41:03
好吧,我知道你的意思,并添加你需要的信息来访问当前的请求,而不是通过它。 – Daff 2009-09-29 08:06:13
感谢您提醒听众。我还是Spring的新手(通常是Java Web开发)。我现在将您的代码与Spring Security的UrlUtils结合使用。奇迹般有效。 – Koraktor 2009-09-29 08:41:05