HttpClient_HttpClient 4.3.6 HTTP状态管理

时间:2022-11-11 15:29:50

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实现:

1Netscape 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状态管理的更多相关文章

  1. Redux状态管理方法与实例

    状态管理是目前构建单页应用中不可或缺的一环,也是值得花时间学习的知识点.React官方推荐我们使用Redux来管理我们的React应用,同时也提供了Redux的文档来供我们学习,中文版地址为http: ...

  2. 表格搞定 Asp&period;net Web 状态管理

    最近在网上搜罗了 ASP.NET WEB 状态管理方面的一些内容,终于把这些内容整合总结了一下. 1. 希望自己通过整理,能够掌握一些,为自己投资. 2. 以便自己忘记,又要浪费时间搜罗. 3. 希望 ...

  3. &lbrack;译&rsqb;面向初学者的Asp&period;Net状态管理技术

    介绍 本文主要讲解Asp.Net应用程序中的状态管理技术(Asp.Net中有多种状态管理技术),并批判性地分析所有状态管理技术的优缺点. 背景 HTTP是无状态的协议.客户端发起一个请求,服务器响应完 ...

  4. &lbrack;Asp&period;Net&rsqb;状态管理(Session、Application、Cache)

    上篇博文介绍了在客户端状态管理的两种方式:http://www.cnblogs.com/wolf-sun/p/3329773.html.除了在客户端上保存状态外,还可以在服务器上保存状态.使用客户端的 ...

  5. &lbrack;Asp&period;Net&rsqb;状态管理(ViewState、Cookie)

    简介 HTTP协议是无状态的.从客户端到服务器的连接可以在每个请求之后关闭.但是一般需要把一些客户端信息从一个页面传送给另一个页面. 无状态的根本原因是:浏览器和服务器使用Socket通信,服务器将请 ...

  6. Ansible状态管理

     转载自:http://xdays.me/ansible状态管理.html 简介 就像所有服务器批量管理工具(puppet有DSL,salt有state)一样,ansible也有自己的状态管理组件 ...

  7. ASP&period;NET状态管理详解,让你明明白白

    开发WinFrom的程序员可能不会在意维护应用程序的状态,因为WinFrom本身就在客户端运行,可以直接在内存中维护其应用程序状态.但ASP.NET应用程序在服务器端运行,客户端使用无状态的http协 ...

  8. 状态管理cookie 案例

    1状态管理:服务器为了追踪同一个客户端发出的请求,将多次交互看成一个整体看待 2:cookie的生存时间,默认情况下,cookie保存在浏览器内存中,只要不关闭浏览器,cookie就一直存在 如果希望 ...

  9. ASP&period;NET Web – 状态管理

    状态类型 客户端或服务器资源 有效时间 ViewState 客户端 只在一个页面中 Cookie 客户端 关闭浏览器时会删除临时cookie,永久cookie存储在客户系统的磁盘上 Session 服 ...

随机推荐

  1. JavaScricp

    常用对话框 1.alert(""):警告对话框,作用是弹出一个警告对话框 2.confirm(""):确定对话框,弹出一个带确定和取消按钮的对话框——确定返回t ...

  2. asp&period;net下webform的ReadOnly和Enabled属性最终渲染的结果

    ReadOnly对应readonly="readonly" Enabled对应disabled="disabled" 然后研究了一下这两种的用法,特此标记一下: ...

  3. hdu3397 线段树 成段更新

    这题真的呵呵了.敲了很长时间,调了很多bug,把0 1 输出,解决了.最后想取反,怎么搞都有bug, 最后还是看了大牛们的博客.不过这题真的敲得爽,调bug时基本把线段树过程全部弄了一遍. #incl ...

  4. Python高频技巧总结&lbrack;基础篇&rsqb;

    0. 概要说明 python应用最多的场景还是web快速开发.爬虫.自动化运维:简单网站.自动Fuzz脚本.收发邮件脚本.简单验证码识别脚本. 爬虫在开发过程中也有很多复用的过程,这里总结一下,以后也 ...

  5. Zookeeper&colon; configuring on centos7

    thispassage is referenced, appreciated. ZooKeeper installation: Download from this site Install java ...

  6. Webstorm编译TypeScript报错

    Accessors are only available when targeting ECMAscript 5 and higher. 解决办法: File Watchers 在tsc.cmd命令上 ...

  7. UVA - 10048 Audiophobia Floyd

    思路:套用Floyd算法思想,d(i, j) = min(d(i,j), max(d(i,k), d(k,j)),就能很方便求得任意两点之间的最小噪音路径. AC代码 #include <cst ...

  8. iOS&amp&semi;nbsp&semi;动画总结—UIView动画

    1.概述 UIKit直接将动画集成到UIView类中,实现简单动画的创建过程.UIView类定义了几个内在支持动画的属性声明,当这些属性发生改变时,视图为其变化过程提供内建的动画支持. 执行动画所需要 ...

  9. 带着新人学springboot的应用11(springboot&plus;Dubbo&plus;Zookeeper 上)

    这次说个在大型项目比较常见的东西,就是分布式,分布式到底是个什么东西呢?概念太大,不好说,就像刚学javaee的人问你,什么是web啊,什么是spring啊等等,你可能觉得,这个东西我好像知道,但是用 ...

  10. Java基础之 数组详解

    前言:Java内功心法之数组详解,看完这篇你向Java大神的路上又迈出了一步(有什么问题或者需要资料可以联系我的扣扣:734999078) 数组概念 同一种类型数据的集合.其实数组就是一个容器. 数组 ...