HTTPURLConnection не следует за перенаправлением от HTTP до HTTPS

Я не могу понять почему Java HttpURLConnection не следует за перенаправлением HTTP от HTTP до URL HTTPS. Я использую следующий код для получения страницы в https://httpstat.us/:

import java.net.URL;
import java.net.HttpURLConnection;
import java.io.InputStream;

public class Tester {

    public static void main(String argv[]) throws Exception{
        InputStream is = null;

        try {
            String httpUrl = "http://httpstat.us/301";
            URL resourceUrl = new URL(httpUrl);
            HttpURLConnection conn = (HttpURLConnection)resourceUrl.openConnection();
            conn.setConnectTimeout(15000);
            conn.setReadTimeout(15000);
            conn.connect();
            is = conn.getInputStream();
            System.out.println("Original URL: "+httpUrl);
            System.out.println("Connected to: "+conn.getURL());
            System.out.println("HTTP response code received: "+conn.getResponseCode());
            System.out.println("HTTP response message received: "+conn.getResponseMessage());
       } finally {
            if (is != null) is.close();
        }
    }
}

Вывод этой программы:

Original URL: http://httpstat.us/301
Connected to: http://httpstat.us/301
HTTP response code received: 301
HTTP response message received: Moved Permanently

Запрос на http://httpstat.us/301 возвращает следующий (сокращенный) ответ (который абсолютно кажется правильным!):

HTTP/1.1 301 Moved Permanently
Cache-Control: private
Content-Length: 21
Content-Type: text/plain; charset=utf-8
Location: https://httpstat.us

К сожалению, Java HttpURLConnection не следует за перенаправлением!

Обратите внимание, что при изменении исходного URL на HTTPS (https://httpstat.us/301) Java будет следовать за перенаправлением как ожидалось!?

92
задан sleske 26 September 2019 в 14:19
поделиться

3 ответа

Перенаправления выполняются, только если они используют один и тот же протокол. (См. метод followRedirect () в источнике.) Невозможно отключить эту проверку.

Несмотря на то, что мы знаем, что он отражает HTTP, из точки протокола HTTP Посмотреть, HTTPS - это просто другой, совершенно другой, неизвестный протокол. Было бы небезопасно выполнять перенаправление без одобрения пользователя.

Например, предположим, что приложение настроено на автоматическое выполнение аутентификации клиента. Пользователь ожидает, что будет просматривать страницы анонимно, потому что он использует HTTP. Но если его клиент следует HTTPS, не спрашивая, его личность раскрывается серверу.

112
ответ дан 24 November 2019 в 06:28
поделиться

Есть ли что-то под названием HttpURLConnection.setFollowRedirects (false) случайно?

Вы всегда можете позвонить

conn.setInstanceFollowRedirects(true);

, если хотите убедиться, что это не влияет остальное поведение приложения.

26
ответ дан 24 November 2019 в 06:28
поделиться

HTTPUrlConnection не отвечает за обработку ответа объекта. Это ожидаемая производительность, она захватывает содержимое запрошенного URL. Это зависит от вас, пользователя функции, чтобы интерпретировать ответ. Он не может прочитать намерения разработчика без спецификации.

-4
ответ дан 24 November 2019 в 06:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: