web-dev-qa-db-ja.com

Java-URLのリダイレクトされたURLを見つける方法?

Java次のようにWebページにアクセスしています:

_URLConnection con = url.openConnection();
_

ただし、場合によっては、URLが別のURLにリダイレクトされます。だから、私は前のURLがリダイレクトされたURLを知りたいです。

以下は、応答として取得したヘッダーフィールドです。

_null-->[HTTP/1.1 200 OK]
Cache-control-->[public,max-age=3600]
last-modified-->[Sat, 17 Apr 2010 13:45:35 GMT]
Transfer-Encoding-->[chunked]
Date-->[Sat, 17 Apr 2010 13:45:35 GMT]
Vary-->[Accept-Encoding]
Expires-->[Sat, 17 Apr 2010 14:45:35 GMT]
Set-Cookie-->[cl_def_hp=copenhagen; domain=.craigslist.org; path=/; expires=Sun, 17     Apr 2011 13:45:35 GMT, cl_def_lang=en; domain=.craigslist.org; path=/; expires=Sun, 17 Apr 2011 13:45:35 GMT]
Connection-->[close]
Content-Type-->[text/html; charset=iso-8859-1;]
Server-->[Apache]
_

そのため、現在、_Set-Cookie_ヘッダーフィールドの値からリダイレクトされたURLを構築しています。上記の場合、リダイレクトされるURLは_copenhagen.craigslist.org_です

特定のURLがリダイレクトするURLを特定する標準的な方法はありますか。

URLが他のURLにリダイレクトするとき、サーバーはリダイレクトされたURLを伝えるLocationヘッダーフィールドを含む中間応答を送信しますが、url.openConnection();メソッドを介してその中間応答を受信しません。

59
Yatendra Goel

URLConnectionHttpURLConnectionにキャストし、notに指示する必要があります HttpURLConnection#setInstanceFollowRedirects() to falseHttpURLConnection#setFollowRedirects() でグローバルに設定することもできます。

その場合、自分でリダイレクトを処理するだけです。 HttpURLConnection#getResponseCode() で応答コードを確認し、 URLConnection#getHeaderField()Locationヘッダーを取得してから、新しいHTTPを起動しますそれを要求します。

53
BalusC

GetInputStream()を呼び出した後、URLConnectionインスタンスでgetUrl()を呼び出すだけです。

URLConnection con = new URL( url ).openConnection();
System.out.println( "orignal url: " + con.getURL() );
con.connect();
System.out.println( "connected url: " + con.getURL() );
InputStream is = con.getInputStream();
System.out.println( "redirected url: " + con.getURL() );
is.close();

実際にコンテンツを取得する前にリダイレクトが発生したかどうかを知る必要がある場合、サンプルコードを次に示します。

HttpURLConnection con = (HttpURLConnection)(new URL( url ).openConnection());
con.setInstanceFollowRedirects( false );
con.connect();
int responseCode = con.getResponseCode();
System.out.println( responseCode );
String location = con.getHeaderField( "Location" );
System.out.println( location );
86
amobiz
public static URL getFinalURL(URL url) {
    try {
        HttpURLConnection con = (HttpURLConnection) url.openConnection();
        con.setInstanceFollowRedirects(false);
        con.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36");
        con.addRequestProperty("Accept-Language", "en-US,en;q=0.8");
        con.addRequestProperty("Referer", "https://www.google.com/");
        con.connect();
        //con.getInputStream();
        int resCode = con.getResponseCode();
        if (resCode == HttpURLConnection.HTTP_SEE_OTHER
                || resCode == HttpURLConnection.HTTP_MOVED_PERM
                || resCode == HttpURLConnection.HTTP_MOVED_TEMP) {
            String Location = con.getHeaderField("Location");
            if (Location.startsWith("/")) {
                Location = url.getProtocol() + "://" + url.getHost() + Location;
            }
            return getFinalURL(new URL(Location));
        }
    } catch (Exception e) {
        System.out.println(e.getMessage());
    }
    return url;
}

User-Agent」および「Referer」を自分で取得するには、インストールされているブラウザのいずれかのデベロッパーモードに移動するだけです(たとえば、Google ChromeでF12を押します)。次に、「ネットワーク」タブに移動し、リクエストのいずれかをクリックします。詳細が表示されるはずです。 「ヘッダー」サブタブを押すだけです(下の画像) request details

8
Mohsen Abasi

HttpURLConnection class API documentation 、特にsetInstanceFollowRedirects()をご覧ください。

1
b_erb

実際には、HTTPクライアントとして堅牢なオープンソースライブラリを使用することをお勧めします。 ASFの http client をご覧になれば、生活がずっと楽になります。これは、http用の使いやすく、スケーラブルで堅牢なクライアントです。

0
Raymond Kroeker