作者: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包:

2、开发

1)创建和配置CloseableHttpClient

CloseableHttpClient是线程安全的,单个实例可用于处理多个HTTP请求。Http Client会自动处理所有的重定向,除非明确地使用disableAutomaticRetries()关闭自动重定向。

2)使用链接创建HttpGet实例,获取重定向。

3)创建本地HTTP执行上下文HttpClientContext。

4)使用Http Client并传递本地实例HttpClientContext,执行HttpGet请求。

5)成功执行请求后,使用上下文对象来获取所有的重定向位置。

6)关闭响应CloseableHttpResponse,释放资源。

  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缩短的地址作为输入,执行后,果然找到了重定向地址。

控制台输出为:

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

4、验证

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

验证OK。


《用Apache HttpClient实现URL重定向》的更多相关文章

  1. 简单物联网:外网访问内网路由器下树莓派Flask服务器

    最近做一个小东西,大概过程就是想在教室,宿舍控制实验室的一些设备. 已经在树莓上搭了一个轻量的flask服务器,在实验室的路由器下,任何设备都是可以访问的:但是有一些限制条件,比如我想在宿舍控制我种花 ...

  2. 利用ssh反向代理以及autossh实现从外网连接内网服务器

    前言 最近遇到这样一个问题,我在实验室架设了一台服务器,给师弟或者小伙伴练习Linux用,然后平时在实验室这边直接连接是没有问题的,都是内网嘛.但是回到宿舍问题出来了,使用校园网的童鞋还是能连接上,使 ...

  3. 外网访问内网Docker容器

    外网访问内网Docker容器 本地安装了Docker容器,只能在局域网内访问,怎样从外网也能访问本地Docker容器? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Docker容器 ...

  4. 外网访问内网SpringBoot

    外网访问内网SpringBoot 本地安装了SpringBoot,只能在局域网内访问,怎样从外网也能访问本地SpringBoot? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装Java 1 ...

  5. 外网访问内网Elasticsearch WEB

    外网访问内网Elasticsearch WEB 本地安装了Elasticsearch,只能在局域网内访问其WEB,怎样从外网也能访问本地Elasticsearch? 本文将介绍具体的实现步骤. 1. ...

  6. 怎样从外网访问内网Rails

    外网访问内网Rails 本地安装了Rails,只能在局域网内访问,怎样从外网也能访问本地Rails? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Rails 默认安装的Rails端口 ...

  7. 怎样从外网访问内网Memcached数据库

    外网访问内网Memcached数据库 本地安装了Memcached数据库,只能在局域网内访问,怎样从外网也能访问本地Memcached数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装 ...

  8. 怎样从外网访问内网CouchDB数据库

    外网访问内网CouchDB数据库 本地安装了CouchDB数据库,只能在局域网内访问,怎样从外网也能访问本地CouchDB数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Cou ...

  9. 怎样从外网访问内网DB2数据库

    外网访问内网DB2数据库 本地安装了DB2数据库,只能在局域网内访问,怎样从外网也能访问本地DB2数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动DB2数据库 默认安装的DB2 ...

  10. 怎样从外网访问内网OpenLDAP数据库

    外网访问内网OpenLDAP数据库 本地安装了OpenLDAP数据库,只能在局域网内访问,怎样从外网也能访问本地OpenLDAP数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动 ...

随机推荐

  1. Eclipse的黑色主题背景(github)

    MoonRise UI Theme   An early version of a dark UI theme for Eclipse 4+. Requirements Eclipse 4.2+ In ...

  2. mysql 数据类型 及 常用命令

    一.数据类型 1.整型 数据类型 存储空间 说明 取值范围 TINYINT 1字节 非常小的整数 带符号值:-128~127 无符号值:0~255 SMALLINT 2字节 较小的整数 带符号值:-3 ...

  3. USB硬件接口相关

    1.USB 设备端的D+为何要拉一个1.5K电阻到3.3v上?(USB是5v供电,但通信的电平是3.3v,所以上拉电平为3.3v:若要上拉到5v,则上拉电阻为10k) usb有主从设备之分,主设备有: ...

  4. solrCloud源码分析之CloudSolrClient

    CloudSolrClient是solrj提供的客户端与solrCloud交互的类.该类的实例与zookeeper进行通信来确定solrCloud collections中的solr endpoint ...

  5. bzoj4032-最短不公共子串

    题意 给出两个长度小于等于2000的小写字母串,四个问题: A的最短子串不是B的子串 A的最短子串不是B的子序列 A的最短子序列不是B的子串 A的最短子序列不是B的子序列 分析 虽然求的是不公共,但是 ...

  6. BZOJ 1965 洗牌(扩展欧几里得)

    容易发现,对于牌堆里第x张牌,在一次洗牌后会变成2*x%(n+1)的位置. 于是问题就变成了求x*2^m%(n+1)=L,x在[1,n]范围内的解. 显然可以用扩展欧几里得求出. # include ...

  7. 表单验证2-JS正则

    1. JS正则:   以/开头,以/结尾. test作用:到里面去找,只要里面有,就返回true:否则就返回false. 例如:rep=/\d+/; 检验里面是否有数字. 2.rep=/^  $/;  ...

  8. BIOS和CMOS的区别

    原文链接:https://www.cnblogs.com/boltkiller/articles/5732424.html 在日常操作和维护计算机的过程中,常常可以听到有关BIOS设置和CMOS设置的 ...

  9. centos 6.5 web service模式 系统 安装php

    1 首先是坚持libxml2出问题,提示如下: checking for xml2-config path... /home/www/thirdlib/libxml2/bin/xml2-configc ...

  10. php扩展库 说明

    1 zlib是提供数据压缩用的函式库, 2 libxml2 Libxml2 is the XML C parser and toolkit developed for the Gnome projec ...