UriComponents返回IP而不是域

时间:2018-11-21 11:16:01

标签: java spring networking dns

我的网络技术薄弱,也许您可​​以帮助我。我有一个简单的代码

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

1 个答案:

答案 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地址作为主机。

这意味着您应该在链条中寻找有罪的事物,首先是谁叫这段代码,然后跟随链接,直到找到原因为止。