URLConnectionなォリダイレクト
-
19-09-2019 - |
質問
するのは納得がいかないのJavaの HttpURLConnection
なフォロリダイレクト.私は、次のコードを取得し このページ:
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 bitlyUrl = "http://bit.ly/4hW294";
URL resourceUrl = new URL(bitlyUrl);
HttpURLConnection conn = (HttpURLConnection)resourceUrl.openConnection();
conn.setConnectTimeout(15000);
conn.setReadTimeout(15000);
conn.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 6.0; ru; rv:1.9.0.11) Gecko/2009060215 Firefox/3.0.11 (.NET CLR 3.5.30729)");
conn.connect();
is = conn.getInputStream();
String res = conn.getURL().toString();
if (res.toLowerCase().contains("bit.ly"))
System.out.println("bit.ly is after resolving: "+res);
}
catch (Exception e) {
System.out.println("error happened: "+e.toString());
}
finally {
if (is != null) is.close();
}
}
}
また、取得しますに対し、以下のような回答(そうで絶対に!):
GET /4hW294 HTTP/1.1
Host: bit.ly
Connection: Keep-Alive
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; ru-RU; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3 (.NET CLR 3.5.30729)
HTTP/1.1 301 Moved
Server: nginx/0.7.42
Date: Thu, 10 Dec 2009 20:28:44 GMT
Content-Type: text/html; charset=utf-8
Connection: keep-alive
Location: https://www.myganocafe.com/CafeMacy
MIME-Version: 1.0
Content-Length: 297
残念ながら、 res
変数を含むを同じURLとストリームには、以下が含まれます(明らかに、Javaの HttpURLConnection
なフォロリダイレクト!):
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<HTML>
<HEAD>
<TITLE>Moved</TITLE>
</HEAD>
<BODY>
<H2>Moved</H2>
<A HREF="https://www.myganocafe.com/CafeMacy">The requested URL has moved here.</A>
<P ALIGN=RIGHT><SMALL><I>AOLserver/4.5.1 on http://127.0.0.1:7400</I></SMALL></P>
</BODY>
</HTML>
解決
ないと思うから自動的にリダイレクトからのHTTP HTTPS(またはその逆).
もしか鏡HTTPからのHTTPプロトコル、HTTPSは、完全に異なって、未知のプロトコルです。この不安全にリダイレクトなユーザー承認されます。
たとえば、次の設定を行うクライアント認証さい。のユーザーが期待する匿名のサーフィンがるのはどうかと思いますので、HTTP.だがアムネスティ-インターナショ下HTTPSに尋ねるのではなく、彼のアイデンティティのことを明らかにし、サーバーにコピーします。
他のヒント
HttpURLConnectionによる デザイン なに自動的にリダイレクトからのHTTP HTTPS(あるいはその逆).次のリダイレクトに重大な安全保障結果をもたらす。SSL(=HTTPS)を作成しセッションならではのユーザーです。このセッションで再利用することも可能な複数の要求.これにより、サーバーへアクセスできるトラックのすべてのご要望からのシングル。この弱形式のアイデンティティーとは悪用可能.また、SSLハンドシェークを求めることができるものとクライアントの証明書。場合はサーバに送信され、お客様のアイデンティティを与え、サーバーにコピーします。
として エリクソン ポートが指摘するように、仮申請の設定を行うクライアント認証さい。のユーザーが期待する匿名のサーフィンがるのはどうかと思いますので、HTTP.だがアムネスティ-インターナショ下HTTPSに尋ねるのではなく、彼のアイデンティティのことを明らかにし、サーバーにコピーします。
のプログラマーは、追加の手順を踏むの確認をクライアント証明書またはSSLセッションidが送信されません前に残念からHTTPにHTTPS.デフォルトは送信されます。場合は、リダイレクションのツールをユーザーについてはリダイレクト.ここはなぜ自動的にリダイレクトには対応しておりません。
それから、これがコードするには、どのリダイレクト.
URL resourceUrl, base, next;
Map<String, Integer> visited;
HttpURLConnection conn;
String location;
int times;
...
visited = new HashMap<>();
while (true)
{
times = visited.compute(url, (key, count) -> count == null ? 1 : count + 1);
if (times > 3)
throw new IOException("Stuck in redirect loop");
resourceUrl = new URL(url);
conn = (HttpURLConnection) resourceUrl.openConnection();
conn.setConnectTimeout(15000);
conn.setReadTimeout(15000);
conn.setInstanceFollowRedirects(false); // Make the logic below easier to detect redirections
conn.setRequestProperty("User-Agent", "Mozilla/5.0...");
switch (conn.getResponseCode())
{
case HttpURLConnection.HTTP_MOVED_PERM:
case HttpURLConnection.HTTP_MOVED_TEMP:
location = conn.getHeaderField("Location");
location = URLDecoder.decode(location, "UTF-8");
base = new URL(url);
next = new URL(base, location); // Deal with relative URLs
url = next.toExternalForm();
continue;
}
break;
}
is = conn.openStream();
...
は何かという HttpURLConnection.setFollowRedirects(false)
万が一?
きい電話
conn.setInstanceFollowRedirects(true);
したい場合などの使い分けが出来て便利です影響を与え、行動しています。
として記述したもので、上記のsetFollowRedirectとsetInstanceFollowRedirectsみ作業時に自動的にリダイレクトプロトコルです。家からのhttpるhttpおよびhttpsにhttps.
setFolloRedirectはクラスレベルで設定したすべてのインスタンスのurl接続はsetInstanceFollowRedirectsは指定されたインスタンス.このようにしていきたいで異なる挙動が異なる場合がございます。
この非常に良い例はこちら http://www.mkyong.com/java/java-httpurlconnection-follow-redirect-example/
別のオプションでの利用 Apache HttpComponentsト:
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
</dependency>
サンプルコード:
CloseableHttpClient httpclient = HttpClients.createDefault();
HttpGet httpget = new HttpGet("https://media-hearth.cursecdn.com/avatars/330/498/212.png");
CloseableHttpResponse response = httpclient.execute(httpget);
final HttpEntity entity = response.getEntity();
final InputStream is = entity.getContent();
HTTPUrlConnectionなチケットの扱いに責任を持つの応答のオブジェクトです。で性能を果によってグラブのコンテンツのURLを求められます。くのユーザーの機能を解釈します。ことを行うことはできませんの意図を開く仕様となります。