HttpClient_HttpClient 4.3.6 HTTP状态管理
HTTP状态管理
最初的HTTP被设计成以状态、请求/应答为导向的协议,它被制作成是没有特殊条款的,以便在状态会话中能交换逻辑关系请求/应答。HTTP协议越来越受欢迎和被采用,越来越多的系统会在应用程序里使用它,这是以前所没有想过的,例如电子商务应用程序。因此,对状态管理的支持就十分有必然了。
(Netscape Communications)网景公司是当时web客户端和服务器软件开发的领航者,在他们的基于专有规格的产品上实现了对HTTP状态管理的支持。后来,网景公司尝试通过出版规格草案去标准化这个机制。这些努力最终通过 theRFC standard track促成了正式的规范定义。然而,应用程序的重要数字仍然是大部分地建立在网景公司那份草案的基础上的,并且和官方的规格不兼容。所有主要的web浏览器开发者感到不得不去保持对这些应用的最大兼容性,进而促进形成了顺从这些标准的碎片。
1.HTTP cookies
HTTP cookie是一个标记或者状态信息包, HTTP代理人和服务器可以通过传输它来保持一个会话。网景工程师常常将它称为"magic cookie"。
HttpClient使用Cookie接口去表现一个抽象的cookie标记。在这个最简单的HTTP cookie结构里是一对名字/值(name/value)。通常一个HTTP cookie也包含许多属性,如:版本、有效的域名、在源服务器上的给cookie 宴请所指定URLs子集的路径、最大的cookie有效期。
SetCookie 接口表现一个Set-Cookie应答标头,它会被源服务器发送给HTTP代理人,为了保持一个会话状态。SetCookie2 接口是SetCookie的扩展,它增加了一些特殊的方法。
ClientCookie 接口扩展了Cookie 接口,它加入了额外的客户功能,如能够完全地恢复原始的cookie属性,就像被源服务器指定的一样。这对于生成Cookie标头是十分重要的,因为一些cookie规格请求,只有当它们被Set-Cookie 或Set-Cookie2标头规定时,Cookie标头应该包含确定的属性。
1.1Cookie版本
Cookies兼容网景规范草案,不过不兼容版本为0的官方规范,但标准兼容cookies 版本为1的,HttpClient可能会由于版本的不同而导致处理cookies的方法不一样。
这是一个重构网景cookie的例子:
BasicClientCookie stdCookie = new BasicClientCookie("name", "value");
stdCookie.setVersion(1);
stdCookie.setDomain(".mycompany.com");
stdCookie.setPath("/");
stdCookie.setSecure(true);
// Set attributes EXACTLY as sent by the server
stdCookie.setAttribute(ClientCookie.VERSION_ATTR, "1");
stdCookie.setAttribute(ClientCookie.DOMAIN_ATTR, ".mycompany.com");
这是一个重构标准cookie的例子。请注意,标准兼容cookie必须要保持所有从源服务器发送过来的属性。
BasicClientCookie stdCookie = new BasicClientCookie("name", "value");
stdCookie.setVersion(1);
stdCookie.setDomain(".mycompany.com");
stdCookie.setPath("/");
stdCookie.setSecure(true);
// Set attributes EXACTLY as sent by the server
stdCookie.setAttribute(ClientCookie.VERSION_ATTR, "1");
stdCookie.setAttribute(ClientCookie.DOMAIN_ATTR, ".mycompany.com");
这是一个重构Set-Cookie2cookie兼容cookie的例子。请注意,标准兼容cookie必须要保持所有从源服务器发送过来的属性。
BasicClientCookie2 stdCookie = new BasicClientCookie2("name", "value");
stdCookie.setVersion(1);
stdCookie.setDomain(".mycompany.com");
stdCookie.setPorts(new int[] {80,8080});
stdCookie.setPath("/");
stdCookie.setSecure(true);
// Set attributes EXACTLY as sent by the server
stdCookie.setAttribute(ClientCookie.VERSION_ATTR, "1");
stdCookie.setAttribute(ClientCookie.DOMAIN_ATTR, ".mycompany.com");
stdCookie.setAttribute(ClientCookie.PORT_ATTR, "80,8080");
2.Cookie规范
CookieSpec接口代表一个cookie管理规范。Cookie管理规范是要严格执行的:
1、Set-Cookie和任意的Set-Cookie2标头分析规则;
2、分析cookies规则;
3、为指定的主机、端口和源路径格式化Cookie标头。
HttpClient包含几个CookieSpec实现:
1、Netscape draft(网景草案):一个顺应了网景公司早期发行的草案的规范。它对兼容传统的代码来说是不可或缺的;
2、Standard(标准的): RFC 2965 HTTP 状态管理规范;
3、Browser compatibility(浏览器兼容):这个实现尝试努力去模仿普通浏览器(如IE和火狐)的行为。
4、Best match(最好的匹配): 'Meta' cookie规范,它是一个以发送HTTP应答结构作为依据捡起cookie策略。它的所有实现都集中在一个类(class)里。
5、Ignore cookies:(忽略cookies) :所有cookie被忽略掉。
强烈建议使用Best Match策略让HttpClient以执行上下文(execution context) 作为依据来捡起一个适当的级别。
3.选择cookie策略
Cookie策略可以被设置,如果有请求,也可以被HTTP请求重载。
RequestConfig globalConfig = RequestConfig.custom()
.setCookieSpec(CookieSpecs.BEST_MATCH)
.build();
CloseableHttpClient httpclient = HttpClients.custom()
.setDefaultRequestConfig(globalConfig)
.build();
RequestConfig localConfig = RequestConfig.copy(globalConfig)
.setCookieSpec(CookieSpecs.BROWSER_COMPATIBILITY)
.build();
HttpGet httpGet = new HttpGet("/");
httpGet.setConfig(localConfig);
4.自定义cookie策略
为了实现自定义的cookie策略需要实现CookieSpec的定制接口,创建一个CookieSpecProvider的实现以创建并初始化定制的规范,最后注册进HttpClient里。一旦自定义的规范被注册,它就能以标准的cookie规范相同的方式被激活。
CookieSpecProvider easySpecProvider = new CookieSpecProvider() {
public CookieSpec create(HttpContext context) {
return new BrowserCompatSpec() {
@Override
public void validate(Cookie cookie, CookieOrigin origin)
throws MalformedCookieException {
// Oh, I am easy
}
};
}
};
Registry<CookieSpecProvider> r = RegistryBuilder.<CookieSpecProvider>create()
.register(CookieSpecs.BEST_MATCH,
new BestMatchSpecFactory())
.register(CookieSpecs.BROWSER_COMPATIBILITY,
new BrowserCompatSpecFactory())
.register("easy", easySpecProvider)
.build();
RequestConfig requestConfig = RequestConfig.custom()
.setCookieSpec("easy")
.build();
CloseableHttpClient httpclient = HttpClients.custom()
.setDefaultCookieSpecRegistry(r)
.setDefaultRequestConfig(requestConfig)
.build();
5.Cookie的持久性
HttpClient可通过实现CookieStore的接口以支持任意物理表述的持久性cookie仓库。默认情况下,CookieStore 的实现会调用CookieStore(一个简单的被java.util.ArrayList所支持的实现)。当容器对象执行垃圾回收时,存储在BasicClientCookie对象里的cookies会丢失。如果有需要,用户可以提供更复杂的实现。
// Create a local instance of cookie store 译:创建本地cookie仓库实例
CookieStore cookieStore = new BasicCookieStore();
// Populate cookies if needed 译:填入cookies
BasicClientCookie cookie = new BasicClientCookie("name", "value");
cookie.setVersion(0);
cookie.setDomain(".mycompany.com");
cookie.setPath("/");
cookieStore.addCookie(cookie);
// Set the store
CloseableHttpClient httpclient = HttpClients.custom()
.setDefaultCookieStore(cookieStore)
.build();
6.HTTP状态管理和执行上下文
在HTTP请求执行过程中,HttpClient加入了以下与状态管理相关的对象去执行上下文:
1) Lookup实例代表实际的cookie规范注册表。这个属性的值在本地上下文件里面优先于默认的;
2)CookieSpec代表实际的cookie规格;
3)CookieOrigin 实例代表实际的关于源服务器的详细信息;
4)CookieStore实例代表实际的cookie仓库。这个属性的值在本地上下文件里面优先于默认的。
本地的HttpContext 对象可以在请求执行之前被用来定制HTTP状态管理上下文,或者在请求执行完后检查它的状态。你可以使用分离的执行上下文来实现每个用户(或每个线程)的状态管理。cookie规范注册表和cookie仓库被定义在本地上下文里会比默认的被设置在HTTP客户端(HTTP client)级别里的有更高的优先级。
CloseableHttpClient httpclient = <...> Lookup<CookieSpecProvider> cookieSpecReg = <...>
CookieStore cookieStore = <...> HttpClientContext context = HttpClientContext.create();
context.setCookieSpecRegistry(cookieSpecReg);
context.setCookieStore(cookieStore);
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();
HttpClient源码地址:http://www.boyunjian.com/javasrc/org.apache.httpcomponents/httpclient/4.3.4/_/
转自:http://blog.csdn.net/lianghongge/article/details/42027069
HttpClient_HttpClient 4.3.6 HTTP状态管理的更多相关文章
- Redux状态管理方法与实例
状态管理是目前构建单页应用中不可或缺的一环,也是值得花时间学习的知识点.React官方推荐我们使用Redux来管理我们的React应用,同时也提供了Redux的文档来供我们学习,中文版地址为http: ...
- 表格搞定 Asp.net Web 状态管理
最近在网上搜罗了 ASP.NET WEB 状态管理方面的一些内容,终于把这些内容整合总结了一下. 1. 希望自己通过整理,能够掌握一些,为自己投资. 2. 以便自己忘记,又要浪费时间搜罗. 3. 希望 ...
- [译]面向初学者的Asp.Net状态管理技术
介绍 本文主要讲解Asp.Net应用程序中的状态管理技术(Asp.Net中有多种状态管理技术),并批判性地分析所有状态管理技术的优缺点. 背景 HTTP是无状态的协议.客户端发起一个请求,服务器响应完 ...
- [Asp.Net]状态管理(Session、Application、Cache)
上篇博文介绍了在客户端状态管理的两种方式:http://www.cnblogs.com/wolf-sun/p/3329773.html.除了在客户端上保存状态外,还可以在服务器上保存状态.使用客户端的 ...
- [Asp.Net]状态管理(ViewState、Cookie)
简介 HTTP协议是无状态的.从客户端到服务器的连接可以在每个请求之后关闭.但是一般需要把一些客户端信息从一个页面传送给另一个页面. 无状态的根本原因是:浏览器和服务器使用Socket通信,服务器将请 ...
- Ansible状态管理
转载自:http://xdays.me/ansible状态管理.html 简介 就像所有服务器批量管理工具(puppet有DSL,salt有state)一样,ansible也有自己的状态管理组件 ...
- ASP.NET状态管理详解,让你明明白白
开发WinFrom的程序员可能不会在意维护应用程序的状态,因为WinFrom本身就在客户端运行,可以直接在内存中维护其应用程序状态.但ASP.NET应用程序在服务器端运行,客户端使用无状态的http协 ...
- 状态管理cookie 案例
1状态管理:服务器为了追踪同一个客户端发出的请求,将多次交互看成一个整体看待 2:cookie的生存时间,默认情况下,cookie保存在浏览器内存中,只要不关闭浏览器,cookie就一直存在 如果希望 ...
- ASP.NET Web – 状态管理
状态类型 客户端或服务器资源 有效时间 ViewState 客户端 只在一个页面中 Cookie 客户端 关闭浏览器时会删除临时cookie,永久cookie存储在客户系统的磁盘上 Session 服 ...
随机推荐
- TFS增加dataserver
通过之前的努力,已经搭建好了一套基本的tfs环境,包括一台nameserver和一台dataserver以及独立的nginx-tfs,而在实际应用中的分布式文件系统,只有一台dataserver明显是 ...
- annotation(@Retention@Target)详解
一.注解:深入理解JAVA注解 要深入学习注解,我们就必须能定义自己的注解,并使用注解,在定义自己的注解之前,我们就必须要了解Java为我们提供的元注解和相关定义注解的语法. 1.元注解(meta-a ...
- Office 2010启动时出现无法验证此应用程序的许可证的解决
Office 2010启动之后弹出一个窗口提示:Microsoft Office无法验证此应用程序的许可证.修复尝试失败或者已被用户取消.应用程序将立即关闭. 遇到这样的情况,原因是Office的系统 ...
- Java for LeetCode 143 Reorder List
Given a singly linked list L: L0→L1→…→Ln-1→Ln, reorder it to: L0→Ln→L1→Ln-1→L2→Ln-2→… You must do th ...
- Gym 100801E Easy Arithmetic (思维题)
题目:传送门.(需要下载PDF) 题意:给定一个长度不超过1000的字符串表达式,向该表达式中加入'+'或'-',使得表达式的值最大,输出该表达式. 题解:比如300-456就改成300-4+56,遇 ...
- Android涉及到的设计模式
转载地址:http://blog.csdn.net/dengshengjin2234/article/details/8502097 1.适配器模式:ListView或GridView的Adapter ...
- deep web
http://free.vpn.wwdhz.com/ (1小时vpn)http://thehiddenwiki.org (Hao123这样的导航网站)http://hss3uro2hsxfogf ...
- EZ的间谍网络(codevs 4093)
由于外国间谍的大量渗入,学校安全正处于高度的危机之中.YJY决定挺身而作出反抗.如果A间谍手中掌握着关于B间谍的犯罪证据,则称A可以揭发B.有些间谍收受贿赂,只要给他们一定数量的美元,他们就愿意交出手 ...
- android中src和background区别
background会根据ImageView组件给定的长宽进行拉伸,而src就存放的是原图的大小,不会进行拉伸.src是图片内容(前景),bg是背景,可以同时使用. 此外:scaleType只对src ...
- cf_ducational Codeforces Round 16_D(gcd)
题意:求R-L区间满足x=a1*k+b1=a2*l+b2的x的个数; 思路:求出最小的满足条件的x0,则ans=(L-x)/(a1/gcd(a1, a2)*a2)+1; 注意剪枝,不然会超时: 代码: ...