我有一个HttpServletRequest对象。
我如何获得导致这个调用到达我的servlet的完整而准确的URL ?
或者至少尽可能准确,因为有些东西是可以重新生成的(也许是参数的顺序)。
我有一个HttpServletRequest对象。
我如何获得导致这个调用到达我的servlet的完整而准确的URL ?
或者至少尽可能准确,因为有些东西是可以重新生成的(也许是参数的顺序)。
当前回答
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();
}
}
其他回答
我使用这个方法:
public static String getURL(HttpServletRequest req) {
String scheme = req.getScheme(); // http
String serverName = req.getServerName(); // hostname.com
int serverPort = req.getServerPort(); // 80
String contextPath = req.getContextPath(); // /mywebapp
String servletPath = req.getServletPath(); // /servlet/MyServlet
String pathInfo = req.getPathInfo(); // /a/b;c=123
String queryString = req.getQueryString(); // d=789
// Reconstruct original requesting URL
StringBuilder url = new StringBuilder();
url.append(scheme).append("://").append(serverName);
if (serverPort != 80 && serverPort != 443) {
url.append(":").append(serverPort);
}
url.append(contextPath).append(servletPath);
if (pathInfo != null) {
url.append(pathInfo);
}
if (queryString != null) {
url.append("?").append(queryString);
}
return url.toString();
}
HttpUtil已弃用,这是正确的方法
StringBuffer url = req.getRequestURL();
String queryString = req.getQueryString();
if (queryString != null) {
url.append('?');
url.append(queryString);
}
String requestURL = url.toString();
我有一个用例来生成cURL命令(我可以在终端使用)从httpServletRequest实例。我创建了一个这样的方法。您可以直接在终端中复制粘贴此方法的输出
private StringBuilder generateCURL(final HttpServletRequest httpServletRequest) {
final StringBuilder curlCommand = new StringBuilder();
curlCommand.append("curl ");
// iterating over headers.
for (Enumeration<?> e = httpServletRequest.getHeaderNames(); e.hasMoreElements();) {
String headerName = (String) e.nextElement();
String headerValue = httpServletRequest.getHeader(headerName);
// skipping cookies, as we're appending cookies separately.
if (Objects.equals(headerName, "cookie")) {
continue;
}
if (headerName != null && headerValue != null) {
curlCommand.append(String.format(" -H \"%s:%s\" ", headerName, headerValue));
}
}
// iterating over cookies.
final Cookie[] cookieArray = httpServletRequest.getCookies();
final StringBuilder cookies = new StringBuilder();
for (Cookie cookie : cookieArray) {
if (cookie.getName() != null && cookie.getValue() != null) {
cookies.append(cookie.getName());
cookies.append('=');
cookies.append(cookie.getValue());
cookies.append("; ");
}
}
curlCommand.append(" --cookie \"" + cookies.toString() + "\"");
// appending request url.
curlCommand.append(" \"" + httpServletRequest.getRequestURL().toString() + "\"");
return curlCommand;
}
// 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()中的StringBuffer的构建器模式,你可以用三元写一个简单的一行代码:
private String getUrlWithQueryParms(final HttpServletRequest request) {
return request.getQueryString() == null ? request.getRequestURL().toString() :
request.getRequestURL().append("?").append(request.getQueryString()).toString();
}
但这只是语法糖。