web-dev-qa-db-ja.com

JavaのHttpUrlConnectionクラスを使用している場合にHostヘッダーをオーバーライドできますか?

次のコードを使用して、Javaでhttp接続を開きます。

 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マット

24
Matt

これは以前は機能していましたが、セキュリティ修正の一環として無効になっています。どうやら変更ログにメモがありません。 bugs.Sun.comには、 #7022056 のようなバグもあります。

別のヘッダーには 同様の質問 があり、答えは詳細に入るので、自分で書くのではなく、リンクするだけです。 :-)

唯一の回避策は、Sun.net.http.allowRestrictedHeaderstrueに設定するか、すでに述べた httpコンポーネント のような別のhttpライブラリを使用することです。

33
Boris

Hostヘッダーは、URLに基​​づいてHttpURLConnectionで埋められます。開くことはできませんfoo.comHost=bar.com[〜#〜] rfc [〜#〜] から

Host request-headerフィールドは、ユーザーまたは参照リソース(通常はHTTP URL)によって指定された元のURIから取得された、要求されているリソースのインターネットホストとポート番号を指定します。

ところで、 Apache httpコンポーネント を試すこともできます。

7
Bozho