httpclient 4.5.1---状态管理

本文详细介绍了如何在HTTP请求中实现自定义Cookie策略、持久化Cookie存储、使用执行上下文管理状态,并通过示例代码展示了HttpClient的高级用法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package com.cycore.dbs.common.demo.hc;

import java.io.IOException;

import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.CookieStore;
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.config.Lookup;
import org.apache.http.config.Registry;
import org.apache.http.config.RegistryBuilder;
import org.apache.http.conn.util.PublicSuffixMatcher;
import org.apache.http.conn.util.PublicSuffixMatcherLoader;
import org.apache.http.cookie.ClientCookie;
import org.apache.http.cookie.CookieOrigin;
import org.apache.http.cookie.CookieSpec;
import org.apache.http.cookie.CookieSpecProvider;
import org.apache.http.impl.client.BasicCookieStore;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.cookie.BasicClientCookie;
import org.apache.http.impl.cookie.DefaultCookieSpecProvider;
import org.apache.http.impl.cookie.RFC6265CookieSpecProvider;

public class HcStateManagementDemo {

	/**
	 * 创建客户端cookie对象
	 */
	public void m1(){
		BasicClientCookie cookie = new BasicClientCookie("name", "value");
		
		//Set effective domain and path attributes
		cookie.setDomain(".mycompany.com");
		cookie.setPath("/");
		//Set attributes exactly as sent by the server
		cookie.setAttribute(ClientCookie.PATH_ATTR, "/");
		cookie.setAttribute(ClientCookie.DOMAIN_ATTR, ".mycompany.com");
	}
	
	/**
	 * cookie说明:CookieSpec接口代表了一个cookie管理说明。该说明被期望服从以下规则:
	 * 1.Set-Cookie头的解析规则;2.解析后的cookie的验证规则;3.指定主机、端口和路径的cookie头的格式化。
	 * 
	 * HttpClient可以使用CookieSpec的多种实现来工作,强烈推荐在新应用中使用Standard或Standard strict策略。
	 * Cookie策略可以在HttpClient中设置且可根据需要在请求层覆盖掉它。
	 * 
	 */
	public void m2(){
		RequestConfig globaConfig=RequestConfig.custom()
//				.setCookieSpec(CookieSpecs.DEFAULT)
				.build();
		
		CloseableHttpClient httpClient=HttpClients.custom()
				.setDefaultRequestConfig(globaConfig)
				.build();
		
		RequestConfig localConfig=RequestConfig.custom()
//				.setCookieSpec(CookieSpecs.STANDARD_STRICT)
				.build();
		
		HttpGet httpGet=new HttpGet("/");
		httpGet.setConfig(localConfig);
	}
	
	/**
	 * 为了实现自定义cookie策略应该创建一个CookieSpec接口的自定义实现,
	 * 创建一个CookieSpecProvider实现去创建和初始化自定义说明的实例和用HttpClient注册工厂。
	 * 一旦自定义说明被注册,它可以和标准cookie说明一样被激活。
	 */
	public void m3(){
		PublicSuffixMatcher publicSuffixMatcher=PublicSuffixMatcherLoader.getDefault();
		
		Registry<CookieSpecProvider> r=RegistryBuilder.<CookieSpecProvider>create()
//				.register(CookieSpecs.DEFAULT, new DefaultCookieSpecProvider(publicSuffixMatcher))
				.register(CookieSpecs.STANDARD, new RFC6265CookieSpecProvider(publicSuffixMatcher))
//				.register("easy", new EasySpecProvider())
				.build();
		
		RequestConfig requestConfig=RequestConfig.custom()
				.setCookieSpec("easy")
				.build();
		
		CloseableHttpClient httpClient=HttpClients.custom()
				.setDefaultCookieSpecRegistry(r)
				.setDefaultRequestConfig(requestConfig)
				.build();
	}
	
	/**
	 * cookie持久化:HttpClient能和一个实现了CookieStore接口的持久化cookie存储的
	 * 任何物理表现形式一起工作。默认的CookieStore实现叫BasicCookieStore实际上是基于
	 * java.util.ArrayList的简单实现。当容器对象进行垃圾回收机制时,存在BasicClientCookie中的
	 * cookie对象会被丢失。用户可以可根据需要提供更复杂的实现。
	 */
	public void m4(){
		//Create a local instance of cookie store
		CookieStore cookieStore=new BasicCookieStore();
		
		//Populate cookies if needed
		BasicClientCookie cookie=new BasicClientCookie("name", "value");
		cookie.setDomain(".mycompany.com");
		cookie.setPath("/");
		cookieStore.addCookie(cookie);
		
		//Set the store
		CloseableHttpClient httpClient=HttpClients.custom()
				.setDefaultCookieStore(cookieStore)
				.build();
	}
	
	/**
	 * HTTP 状态管理和执行上下文:在HTTP请求章节中HttpClient提供了如下和执行上下文相关的状态管理对象:
	 * 1.Lookup实例代表了实际的cookie说明注册。设置在本地上下文中的该属性值优先于默认值。
	 * 2.CookieSpec实例代表了实际的cookie说明。
	 * 3.CookieOrigin实例代表了源服务器的实际详细信息。
	 * 4.CookieStore实例代表了实际的cookie存储。设置在本地上下文中的该属性值优先于默认值。
	 * 
	 * 本地的HttpContext对象可以用来定制优先于请求执行的HTTP状态管理上下文,或者在请求执行后检查它的状态。
	 * 用户可以使用分离的执行上下文以实现每一个用户(或每一个线程)的状态管理。
	 * 一个定义在本地上下文中的cookie说明注册和cookie存储将优先于设置在HTTP客户端层面的默认值。
	 * @throws IOException 
	 * @throws ClientProtocolException 
	 */
	public void m5() throws ClientProtocolException, IOException{
		
		Lookup<CookieSpecProvider> cookieSpecReg =RegistryBuilder.<CookieSpecProvider>create().build();
		CookieStore cookieStore = new BasicCookieStore();
		
		HttpClientContext context = HttpClientContext.create();
		context.setCookieSpecRegistry(cookieSpecReg);
		context.setCookieStore(cookieStore);
		
		CloseableHttpClient httpClient = HttpClients.createDefault();
		HttpGet httpGet = new HttpGet("http://somehost/");
		CloseableHttpResponse response1 = httpClient.execute(httpGet, context);
		//<...>
		//Cookie origin details
		CookieOrigin cookieOrigin = context.getCookieOrigin();
		//Cookie spec used
		CookieSpec cookieSpec = context.getCookieSpec();
		
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值