开发者社区> chszs> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

用Apache HttpClient实现URL重定向

简介: 版权声明:本文为博主chszs的原创文章,未经博主允许不得转载。 https://blog.csdn.net/chszs/article/details/16996489 《用Apache HttpClient实现URL重定向》 作者:chszs,转载需注明。
+关注继续查看
版权声明:本文为博主chszs的原创文章,未经博主允许不得转载。 https://blog.csdn.net/chszs/article/details/16996489

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

控制台输出为:

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

4、验证

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


验证OK。




版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
【Flink】(04)Apache Flink 漫谈系列 —— 实时计算 Flink 与 Alibaba Cloud Realtime Compute 剖析1
【Flink】(04)Apache Flink 漫谈系列 —— 实时计算 Flink 与 Alibaba Cloud Realtime Compute 剖析1
75 0
Apache Flink 1.12.0 升级说明
就在刚才 Apache Flink 社区宣布 Flink 1.12.0 版本正式发布了,从这个版本开始真正的流批一体又往前迈了一大步. Release Notes - Flink 1.12 这些发布说明讨论了在 Flink 1.11 和 Flink 1.12 之间发生变化的重要方面,比如配置、行为或依赖关系。如果您计划将 Flink 版本升级到 1.12,请仔细阅读这些说明。
103 0
欢迎加入 Apache Flink Slack 空间
Apache Flink 社区宣布创建其专属的 Slack 空间,欢迎广大社区开发者与用户加入。
828 0
当Atlas遇见Flink——Apache Atlas 2.2.0发布!
距离上次atlas发布新版本已经有一年的时间了,但是这一年元数据管理平台的发展一直没有停止。Datahub,Amundsen等等,都在不断的更新着自己的版本。但是似乎Atlas在元数据管理,数据血缘领域的地位一直没有动摇。
187 0
Apache Flink 邀您共度「2022开源之夏」,成为开源新星
开源项目资深维护者(社区导师)亲自指导,用 3 个月的时间感受开源技术共建的魅力,完成项目并贡献给社区后,还将获得活动奖金和结项证书。
544 0
使用 Flink CDC 实现 MySQL 数据实时入 Apache Doris
本文通过实例来演示怎么通过Flink CDC 结合Doris的Flink Connector实现从Mysql数据库中监听数据并实时入库到Doris数仓对应的表中。
920 0
重磅!Apache Flink 1.11 功能前瞻抢先看!
Flink 1.11 版本即将正式宣告发布!为满足大家的好奇与期待,我们邀请 Flink 核心开发者对 1.11 版本的功能特性进行解读与分享。Flink 1.11 在 1.10 的基础上对许多方面进行了完善和改进,并致力于进一步提高 Flink 的可用性及性能。
16632 0
Apache Flink 漫谈系列(02) - 概述
Apache Flink 的命脉 "命脉" 即生命与血脉,常喻极为重要的事物。系列的首篇,首篇的首段不聊Apache Flink的历史,不聊Apache Flink的架构,不聊Apache Flink的功能特性,我们用一句话聊聊什么是 Apache Flink 的命脉?我的答案是:Apache Flink 是以"批是流的特例"的认知进行系统设计的。
12883 0
Apache Flink 漫谈系列(01) - 序
本人 孙金城,淘宝花名"金竹",阿里巴巴高级技术专家,Apache Flink Committer。目前就职于阿里巴巴计算平台事业部,自2015年以来一直投入于基于Apache Flink的设计研发工作。
12919 0
+关注
841
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载