热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

用ApacheHttpClient实现URL重定向

《用ApacheHttpClient实现URL重定向》作者:chszs,转载需注明。博客主页:http:blog.csdn.netchszs很多网站都使用了URL重定向技术,把一个原始请求从一

《用Apache HttpClient实现URL重定向》

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

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 getAllRedirectLocations(String link) throws ClientProtocolException, IOException{
List 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 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|vhttp://hero.pongo.cn/

4、验证

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


验证OK。





推荐阅读
author-avatar
kafei
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有