设为首页 收藏本站
查看: 562|回复: 0

[经验分享] 用Apache HttpClient实现URL重定向

[复制链接]

尚未签到

发表于 2017-1-5 07:17:48 | 显示全部楼层 |阅读模式
  作者:chszs,转载需注明。博客主页:http://blog.csdn.net/chszs
  很多网站都使用了URL重定向技术,把一个原始请求从一个位置路由到另一个位置。原因可能是多方面的,比如域名转发、URL缩写、隐私保护、在同一网站维持相似的域名等。
  本文讲述怎样使用Apache HTTPComponents HttpClient实现URL重定向。
  本文使用的工具:
  1. Apache HttpComponents Client 4.3.1
  2. JDK 1.7
1、创建Java项目
  项目我命名为HttpClientTest,导入如下JAR包:
DSC0000.jpg

2、开发
  1)创建和配置CloseableHttpClient
  CloseableHttpClient是线程安全的,单个实例可用于处理多个HTTP请求。Http Client会自动处理所有的重定向,除非明确地使用disableAutomaticRetries()关闭自动重定向。
  2)使用链接创建HttpGet实例,获取重定向。
  3)创建本地HTTP执行上下文HttpClientContext。
  4)使用Http Client并传递本地实例HttpClientContext,执行HttpGet请求。
  5)成功执行请求后,使用上下文对象来获取所有的重定向位置。
  6)关闭响应CloseableHttpResponse,释放资源。
[java] view plaincopyprint? DSC0001.jpg



  • 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 List<URI> getAllRedirectLocations(String link) throws ClientProtocolException, IOException{  
  •         List<URI> 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();  
  •         List<URI> 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缩短的地址作为输入,执行后,果然找到了重定向地址。
  控制台输出为:
[python] view plaincopyprint?



  • http://t.cn/zjYwrl3  
  • |  
  • v  
  • http://hero.pongo.cn/  

4、验证
  用在线URL重定向检测工具测试:

  验证OK。
  http://www.webtoolhub.com/tn561352-url-redirection-checker.aspx
  http://blog.csdn.net/chszs/article/details/16996489

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-323920-1-1.html 上篇帖子: Wins2003系统中Apache性能优化方法 下篇帖子: python django apache配置路径问题
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表