我有一个HttpServletRequest对象。

我如何获得导致这个调用到达我的servlet的完整而准确的URL ?

或者至少尽可能准确,因为有些东西是可以重新生成的(也许是参数的顺序)。


当前回答

在Spring项目中您可以使用

UriComponentsBuilder.fromHttpRequest(new ServletServerHttpRequest(request)).build().toUriString()

其他回答

在Spring项目中您可以使用

UriComponentsBuilder.fromHttpRequest(new ServletServerHttpRequest(request)).build().toUriString()

HttpServletRequest有以下方法:

getRequestURL() -在查询字符串分隔符之前返回完整URL的部分? getQueryString() -在查询字符串分隔符后返回完整URL的部分?

所以,要获得完整的URL,只需做:

public static String getFullURL(HttpServletRequest request) {
    StringBuilder requestURL = new StringBuilder(request.getRequestURL().toString());
    String queryString = request.getQueryString();

    if (queryString == null) {
        return requestURL.toString();
    } else {
        return requestURL.append('?').append(queryString).toString();
    }
}
// http://hostname.com/mywebapp/servlet/MyServlet/a/b;c=123?d=789

public static String getUrl(HttpServletRequest req) {
    String reqUrl = req.getRequestURL().toString();
    String queryString = req.getQueryString();   // d=789
    if (queryString != null) {
        reqUrl += "?"+queryString;
    }
    return reqUrl;
}

结合getRequestURL()和getQueryString()的结果应该会得到您想要的结果。

在HttpServletRequest对象上使用以下方法

以getRequestURI () 返回该请求的URL部分,从协议名到HTTP请求第一行的查询字符串。

java.lang.StringBuffer getRequestURL () -重建客户端用来发出请求的URL。

以getQueryString () -返回包含在请求URL中路径后面的查询字符串。