UriComponents возвращает IP вместо домена - PullRequest
0 голосов
/ 21 ноября 2018

Я слаб в сетевых технологиях и, может быть, вы можете мне помочь.У меня есть простой код

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, а не имя домена.Только то, что я могу сказать больше - на моей локальной машине у меня нет проблем с этим.Код возвращает localhost, или если я добавлю 127.0.0.1 exmaple.com в файл hosts, мой код вернет правильный exmaple.com, без ip

1 Ответ

0 голосов
/ 21 ноября 2018

Это не проблема 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, это означает, что URL, указанный во входе (request.getRequestURL().toString()), содержал адрес IP в качестве хоста.

Это означает, что вы должны искать виновного в цепочке, начиная с того, кто вызывает этот кусок кода, и переходя по ссылкам, пока не найдете причину.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...