2009-09-29 85 views
56

我想根据活动请求客户端使用的URL来创建URL。有没有什么比采取当前的HttpServletRequest对象和它的getParameter...()方法更聪明的方法来重建完整的URL,包括(也是唯一的)它的GET参数。在Spring MVC中获取当前URL的最佳方式是什么?

说明:如果可能,我想从使用HttpServletRequest对象辞职。

回答

80

那么有两种方法可以更容易地访问这些数据,但该接口不提供一次调用就可以获得整个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() 
+0

好吧,这是一个类似的方法我到目前为止已经完成。但是我正在寻找一种方法来做到这一点,而不用实际使用'HttpServletRequest'对象。这是因为我使用了多个助手类/方法,而且我不想每次都传递请求对象。 – Koraktor 2009-09-29 07:41:03

+0

好吧,我知道你的意思,并添加你需要的信息来访问当前的请求,而不是通过它。 – Daff 2009-09-29 08:06:13

+0

感谢您提醒听众。我还是Spring的新手(通常是Java Web开发)。我现在将您的代码与Spring Security的UrlUtils结合使用。奇迹般有效。 – Koraktor 2009-09-29 08:41:05

8
在JSP文件

request.getAttribute("javax.servlet.forward.request_uri") 
12

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(); 
} 
+0

仅给出主机名称 – Vivek 2015-07-05 07:19:31

25

,而不是直接使用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(); 
+0

谢谢,这是对我最有帮助的答案。 – John 2017-04-25 12:08:10

+0

作为Spring 3.1 – m4rtin 2018-01-08 10:48:18

+0

@ m4rtin的答案应该是我接受的答案我回答了我自己的问题,并且不想为最初帮助我解决问题的人解答问题。 – Koraktor 2018-01-08 11:57:09

相关问题