Я не могу понять почему 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 будет следовать за перенаправлением как ожидалось!?
Перенаправления выполняются, только если они используют один и тот же протокол. (См. метод followRedirect ()
в источнике.) Невозможно отключить эту проверку.
Несмотря на то, что мы знаем, что он отражает HTTP, из точки протокола HTTP Посмотреть, HTTPS - это просто другой, совершенно другой, неизвестный протокол. Было бы небезопасно выполнять перенаправление без одобрения пользователя.
Например, предположим, что приложение настроено на автоматическое выполнение аутентификации клиента. Пользователь ожидает, что будет просматривать страницы анонимно, потому что он использует HTTP. Но если его клиент следует HTTPS, не спрашивая, его личность раскрывается серверу.
Есть ли что-то под названием HttpURLConnection.setFollowRedirects (false)
случайно?
Вы всегда можете позвонить
conn.setInstanceFollowRedirects(true);
, если хотите убедиться, что это не влияет остальное поведение приложения.
HTTPUrlConnection не отвечает за обработку ответа объекта. Это ожидаемая производительность, она захватывает содержимое запрошенного URL. Это зависит от вас, пользователя функции, чтобы интерпретировать ответ. Он не может прочитать намерения разработчика без спецификации.