天天看點

用Apache HttpClient實作URL重定向

很多網站都使用了URL重定向技術,把一個原始請求從一個位置路由到另一個位置。原因可能是多方面的,比如域名轉發、URL縮寫、隐私保護、在同一網站維持相似的域名等。

本文講述怎樣使用Apache HTTPComponents HttpClient實作URL重定向。

本文使用的工具:

2. JDK 1.7

1、建立Java項目

項目我命名為HttpClientTest,導入如下JAR包:

用Apache HttpClient實作URL重定向

2、開發

1)建立和配置CloseableHttpClient

CloseableHttpClient是線程安全的,單個執行個體可用于處理多個HTTP請求。Http Client會自動處理所有的重定向,除非明确地使用disableAutomaticRetries()關閉自動重定向。

2)使用連結建立HttpGet執行個體,擷取重定向。

3)建立本地HTTP執行上下文HttpClientContext。

4)使用Http Client并傳遞本地執行個體HttpClientContext,執行HttpGet請求。

5)成功執行請求後,使用上下文對象來擷取所有的重定向位置。

6)關閉響應CloseableHttpResponse,釋放資源。

點選(此處)折疊或打開

package com.ch.net;

import java.io.IOException;

import java.net.URI;

import java.util.List;

import org.apache.http.client.ClientProtocolException;

import org.apache.http.client.config.CookieSpecs;

import org.apache.http.client.config.RequestConfig;

import org.apache.http.client.methods.CloseableHttpResponse;

import org.apache.http.client.methods.HttpGet;

import org.apache.http.client.protocol.HttpClientContext;

import org.apache.http.impl.client.CloseableHttpClient;

import org.apache.http.impl.client.HttpClients;

public class UrlRedirectionDemo {

    // 浏覽器Agent

    public static String USER_AGENT = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.151 Safari/535.19";

    // 建立并配置HttpClient

    private static final CloseableHttpClient httpClient = HttpClients

            .custom()

            .setUserAgent(USER_AGENT)

            .setDefaultRequestConfig(

                    RequestConfig.custom()

                            .setCookieSpec(CookieSpecs.BROWSER_COMPATIBILITY)

                            .build()).build();

    /**

     * 根據給定的連結擷取所有的重定向位置

     * @param link 給定的連結

     * @return

     * @throws ClientProtocolException

     * @throws IOException

     */

    public ListURI> getAllRedirectLocations(String link) throws ClientProtocolException, IOException{

        ListURI> redirectLocations = null;

        CloseableHttpResponse response = null;

        try{

            HttpClientContext context = HttpClientContext.create();

            HttpGet httpGet = new HttpGet(link);

            response = httpClient.execute(httpGet, context);

            // 擷取所有的重定向位置

            redirectLocations = context.getRedirectLocations();

        } finally{

            if(response!=null){

                response.close();

            }

        }

        return redirectLocations;

    }

    public static void main(String[] args) throws ClientProtocolException, IOException{

        // 輸入URL

        String link = "http://t.cn/zjYwrl3";

        UrlRedirectionDemo demo = new UrlRedirectionDemo();

        ListURI> allRedirectLocations = demo.getAllRedirectLocations(link);

        if(allRedirectLocations!=null){

            System.out.println(link);

            for(URI uri : allRedirectLocations){

                System.out.println("|\nv\n" + uri.toASCIIString());

        } else{

            System.out.println("Not found!");

}

如果使用預設的User-Agent設定,有些網站會傳回HTTP 500狀态碼錯誤。一旦網站傳回200狀态碼而且傳回的HTML的内容是“500 server error”時,為保證相容性,應該使用标準的Web浏覽器的User-Agent字元串。

500 – 伺服器内部錯誤

200 - 伺服器成功傳回網頁

3、運作

我在新浪微網誌中找了個URL縮短的位址作為輸入,執行後,果然找到了重定向位址。

控制台輸出為:

http://t.cn/zjYwrl3

|

v

http://hero.pongo.cn/

4、驗證

用線上URL重定向檢測工具測試:

用Apache HttpClient實作URL重定向

驗證OK。