我的网络技术薄弱,也许您可以帮助我。我有一个简单的代码
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes())
.getRequest();
UriComponents uriComponents = UriComponentsBuilder.fromHttpUrl(request.getRequestURL().toString()).build();
UriComponents newUriComponents = UriComponentsBuilder.newInstance().scheme(uriComponents.getScheme())
.host(uriComponents.getHost()).port(uriComponents.getPort()).build();
return newUriComponents.toUriString() + request.getContextPath();
此代码应使用特定路径将链接返回到我的服务器。问题是-在产品服务器上uriComponents.getHost()返回IP而不是域名。通过浏览器访问服务器时,域有效。我可以去 http://exmaple.com/some/one/path并希望得到答复(在JSON中,没有重定向。仅获取请求和json答复)-http://exmaple.com/some/another/path但我显示的代码返回-http://78.54.128.98.com/some/another/path(仅IP地址例)。所以我不知道为什么我的代码返回IP而不返回域名。我只能说更多-在我的本地计算机上,我没有任何问题。代码返回本地主机,或者如果我将127.0.0.1 exmaple.com添加到主机文件,我的代码将返回正确的exmaple.com,没有任何ip
答案 0 :(得分:0)
这不是URIComponents
的问题,它解析输入中得到的内容。更具体地说,您会看到UriComponentsBuilder.fromHttpUrl
的来源:
public static UriComponentsBuilder fromHttpUrl(String httpUrl) {
Assert.notNull(httpUrl, "HTTP URL must not be null");
Matcher matcher = HTTP_URL_PATTERN.matcher(httpUrl);
if (matcher.matches()) {
UriComponentsBuilder builder = new UriComponentsBuilder();
String scheme = matcher.group(1);
builder.scheme(scheme != null ? scheme.toLowerCase() : null);
builder.userInfo(matcher.group(4));
String host = matcher.group(5);
if (StringUtils.hasLength(scheme) && !StringUtils.hasLength(host)) {
throw new IllegalArgumentException("[" + httpUrl + "] is not a valid HTTP URL");
}
builder.host(host);
String port = matcher.group(7);
if (StringUtils.hasLength(port)) {
builder.port(port);
}
builder.path(matcher.group(8));
builder.query(matcher.group(10));
return builder;
}
else {
throw new IllegalArgumentException("[" + httpUrl + "] is not a valid HTTP URL");
}
}
,您会注意到在URL的预期结构上定义了模式匹配器,并且根据匹配器对部分进行了解析。如果看到IP
,则表示输入(request.getRequestURL().toString()
)中指定的url包含IP
地址作为主机。
这意味着您应该在链条中寻找有罪的事物,首先是谁叫这段代码,然后跟随链接,直到找到原因为止。