首页 > Java开发 > 用Apache HttpClient实现URL重定向

用Apache HttpClient实现URL重定向

很多网站都使用了URL重定向技术,把一个原始请求从一个位置路由到另一个位置。原因可能是多方面的,比如域名转发、URL缩写、隐私保护、在同一网站维持相似的域名等。

本文讲述怎样使用Apache HTTPComponents HttpClient实现URL重定向。

本文使用的工具:

1. Apache HttpComponents Client 4.3.1

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,释放资源。

 

[java][/java] view plaincopyprint?在CODE上查看代码片派生到我的代码片

  1. package com.ch.net;
  2. import java.io.IOException;
  3. import java.net.URI;
  4. import java.util.List;
  5. import org.apache.http.client.ClientProtocolException;
  6. import org.apache.http.client.config.CookieSpecs;
  7. import org.apache.http.client.config.RequestConfig;
  8. import org.apache.http.client.methods.CloseableHttpResponse;
  9. import org.apache.http.client.methods.HttpGet;
  10. import org.apache.http.client.protocol.HttpClientContext;
  11. import org.apache.http.impl.client.CloseableHttpClient;
  12. import org.apache.http.impl.client.HttpClients;
  13. public class UrlRedirectionDemo {
  14.     // 浏览器Agent
  15.     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";
  16.     // 创建并配置HttpClient
  17.     private static final CloseableHttpClient httpClient = HttpClients
  18.             .custom()
  19.             .setUserAgent(USER_AGENT)
  20.             .setDefaultRequestConfig(
  21.                     RequestConfig.custom()
  22.                             .setCookieSpec(CookieSpecs.BROWSER_COMPATIBILITY)
  23.                             .build()).build();
  24.     /**
  25.      * 根据给定的链接获取所有的重定向位置
  26.      * @param link 给定的链接
  27.      * @return
  28.      * @throws ClientProtocolException
  29.      * @throws IOException
  30.      */
  31.     public List<URI> getAllRedirectLocations(String link) throws ClientProtocolException, IOException{
  32.         List<URI> redirectLocations = null;
  33.         CloseableHttpResponse response = null;
  34.         try{
  35.             HttpClientContext context = HttpClientContext.create();
  36.             HttpGet httpGet = new HttpGet(link);
  37.             response = httpClient.execute(httpGet, context);
  38.             // 获取所有的重定向位置
  39.             redirectLocations = context.getRedirectLocations();
  40.         } finally{
  41.             if(response!=null){
  42.                 response.close();
  43.             }
  44.         }
  45.         return redirectLocations;
  46.     }
  47.     public static void main(String[] args) throws ClientProtocolException, IOException{
  48.         // 输入URL
  49.         String link = "http://t.cn/zjYwrl3";
  50.         UrlRedirectionDemo demo = new UrlRedirectionDemo();
  51.         List<URI> allRedirectLocations = demo.getAllRedirectLocations(link);
  52.         if(allRedirectLocations!=null){
  53.             System.out.println(link);
  54.             for(URI uri : allRedirectLocations){
  55.                 System.out.println("|\nv\n" + uri.toASCIIString());
  56.             }
  57.         } else{
  58.             System.out.println("Not found!");
  59.         }
  60.     }
  61. }

如果使用默认的User-Agent设置,有些网站会返回HTTP 500状态码错误。一旦网站返回200状态码而且返回的HTML的内容是“500 server error”时,为保证兼容性,应该使用标准的Web浏览器的User-Agent字符串。

 

500 – 服务器内部错误

200 - 服务器成功返回网页

3、运行

我在新浪微博中找了个URL缩短的地址作为输入,执行后,果然找到了重定向地址。

控制台输出为:

 

[python][/python] view plaincopyprint?在CODE上查看代码片派生到我的代码片

  1. http://t.cn/zjYwrl3
  2. |
  3. v
  4. http://hero.pongo.cn/

 

4、验证

 

用在线URL重定向检测工具测试:

验证OK。

 


本文固定链接: http://www.devba.com/index.php/archives/3707.html | 开发吧

报歉!评论已关闭.