Могу ли я переопределить заголовок хоста, где используется класс HttpUrlConnection в Java? - PullRequest
23 голосов
/ 04 октября 2011

Я использую следующий код для открытия http-соединения в Java:

 URL url = new URL("http://stackoverflow.com");
 HttpURLConnection conn = (HttpURLConnection) url.openConnection();
 conn.setDoOutput(true);
 conn.setRequestMethod("GET");
 conn.setRequestProperty("Host", "Test:8080");
 conn.getOutputStream();

Однако вызов conn.setRequestProperty («Host», «Test: 8080»), похоже, не имеет никакого эффекта, независимо от того, в каком порядке я вызываю методы, и Host сбрасывается на целевой сервер. Есть ли способ переопределить заголовок узла без использования другой библиотеки?

TIA Matt

Ответы [ 3 ]

32 голосов
/ 17 ноября 2011

Раньше это работало, но было отключено как часть исправления безопасности.Видимо без заметки в журнале изменений.Для этого на bugs.sun.com есть даже такие ошибки, как # 7022056 .

Существует аналогичный вопрос для другого заголовка, где ответ более подробно рассматривается вдетали, поэтому я просто связываю это вместо того, чтобы писать это сам.: -)

Единственные обходные пути, по-видимому, устанавливают sun.net.http.allowRestrictedHeaders в true или используют другую http-библиотеку, например, уже упомянутые http компоненты .

7 голосов
/ 04 октября 2011

Заголовок Host заполняется HttpURLConnection на основе URL. Вы не можете открыть foo.com с Host=bar.com. Из RFC

В поле заголовка запроса Host указывается узел Интернета и номер порта запрашиваемого ресурса, полученные из исходного URI, предоставленного пользователем или ссылающимся ресурсом (обычно HTTP-URL)

Кстати, вы также можете попробовать apache http компоненты .

0 голосов
/ 18 марта 2015

Эта проблема связана с тем, как volley обрабатывает HTTPUrlConnection и политику повторных попыток.

Быстрое решение проблемы - расширить класс "HurlStack" и переопределить функцию "createConnection", чтобы вернуть HTTPUrlConnection с ChunkStreamMode, равным 0 *.1003 *

public class CustomHurlStack extends HurlStack {


   public CustomHurlStack(){
       super();

   }

   @Override
   protected HttpURLConnection createConnection(URL url) throws IOException {
       HttpURLConnection connection = super.createConnection(url);
       connection.setChunkedStreamingMode(0);
       return connection;
   }

}

...