您的位置:首页 > 理论基础 > 计算机网络

httpclient 4.5.1---状态管理

2016-03-27 21:47 543 查看
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();

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: