很多網站都使用了URL重定向技術,把一個原始請求從一個位置路由到另一個位置。原因可能是多方面的,比如域名轉發、URL縮寫、隐私保護、在同一網站維持相似的域名等。
本文講述怎樣使用Apache HTTPComponents HttpClient實作URL重定向。
本文使用的工具:
2. JDK 1.7
1、建立Java項目
項目我命名為HttpClientTest,導入如下JAR包:
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重定向檢測工具測試:
驗證OK。