HttpClient第三章 HTTP状态管理

原始的HTTP被设置成无状态的面向请求响应的协议,它并没有为基于跨几个逻辑相关的请求/响应交换的有状态会话提供所需的功能。但是随着HTTP协议越来越流行并且被应用,越来越多的系统开始用它作为原本并不是它的作用的功能,例如,电子商务传输应用,这样一来,对于状态管理的支持成为一个必要的功能。

那时网景公司作为一个web客户端和服务器端软件的领导开发者在他们的一个基于特殊的说明的产品里实现了对HTTP状态管理的支持,后来,网景通过发布一个知指导说明书试图标准化这一机制。这些努力促成了通过RFC标准的正式定义。然而,大量应用的管理仍然基于网景的指导说明并且与官方的定义不兼容。所有主流浏览器的开发者感到必须和那些促成标准的应用保持兼容。

3.1 HTTP cookies

一个HTTP cookie 是一个印记或者一个HTTP代理和目标服务器之间可以交换用以维持一个会话的状态信息的数据包。网景的工程师习惯于称之为“魔法cookie”。

HttpClient使用Cookie接口描述抽象cookie,HTTP cookie最简单的形式是只有名称/值对。通常一个HTTP cookie也包含很多属性,例如一个有效的域名,一个URLs的相对路径,或者cookie的最大有效周期。

SetCookie接口描述了一组为了保持会话状态由原始服务器发送至HTTP代理的cookie响应头。

ClientCookie接口继承了Cookie接口并且添加了具体的功能,例如,当原始服务器明确提出返回原始cookie时返回cookie的功能。这对生成cookie头非常重要,因为一些cookie指导说明要求仅当这些cookie在cookie集合头中被明确要求的时候cookie头应该包含确定的属性。

下面是一个创建客户端cookie对象的例子:

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");

3.2 Cookie 规范

CookieSpec接口描述了cookie管理规范,cookie管理规范有望加强:

  • 解析设置cookie头的规则。
  • 校验解析cookie的规则。
  • 对于给定原始主机、端口和路径格式化cookie头。

HttpClient提供了几个CookieSpec的实现:

  • 严格遵守标准的策略:状态管理策略遵从RFC6265第四章定义的语法和词法。
  • 标准策略:状态管理策略遵从一个更加松散的RFC6265第四章定义的语法和词法,目的是位了和那些已经存在的没有遵从标准协议的服务器交互。
  • 由网景公司规划的策略(废弃):这个策略遵从网景公司发布的原始定义,除非有绝对的需求否则应该避免。
  • RFC2965号策略(废弃):状态管理策略遵从废弃的RFC2965定义的策略,请不要在新应用中使用。
  • RFC2109号策略(废弃):状态管理策略遵从废弃的RFC2109定义的策略,请不要在新应用中使用。
  • 浏览器兼容性策略(废弃):此策略和老版本的浏览器例如IE和FireFox冲突,请不要再新应用中使用。
  • 默认的策略:默认的cookie策略是一个复合的策略,它即遵从了RFC2965和RFC2109又遵从了基于被HTTP响应发送的cookie的属性(例如版本属性,现已废弃)的网景公司出品的实现,这个策略在下一个标准的HttpClient版本发布时过时。
  • 忽略cookie的策略:所有的cookie被忽略。

强烈建议在新的应用中使用标准或严格遵从标准的策略。废弃的规范应该只用于兼容系统。在下个HttpClient主要版本发布的时候将移除那些支持废弃规范的策略。

3.3 选择cookie策略

cookie策略可以在HttpClient中设置并且如果需要还可以重写HTTP请求。

RequestConfig globalConfig = RequestConfig.custom().setCookieSpec(CookieSpecs.DEFAULT).build();
CloseableHttpClient httpclient = HttpClients.custom().setDefaultRequestConfig(globalConfig).build();
RequestConfig localConfig = RequestConfig.copy(globalConfig).setCookieSpec(CookieSpecs.STANDARD_STRICT).build();
HttpGet httpGet = new HttpGet("/");
httpGet.setConfig(localConfig);

3.4 定制cookie策略

为了实现定制cookie策略,你应该创建一个定制的CookieSpec接口的实现,创建一个CookieSpecProvider实现类去创建和初始化定制规范的实例并使用 HttpClient注册工厂。一旦定制的实现被注册就可以以和标准cookie的实现相同的方式被激活。

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();

3.5 cookie持久化

HttpClient可以处理任何实现了CookieStore接口的持久化cookie存储。默认的CookieStore实现是BasicCookieStore,它是一个用ArrayList存储的简单实现。当容器对象进行垃圾回收的时候在BasicClientCookie对象存储的cookie将会丢失,如果需要用户可以提供更多复杂的实现。

// 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();

3.6 HTTP状态管理与执行上下文

此章节增加了下面的状态管理相关对象:

  • Lookup实例代表了实际的cookie细节记录。在本地上写文中这个属性值的设置优先级高于默认的。
  • CookieSpec实例表示实际的cookie细节。
  • CookieOrigin实例表示了原始服务器的实际细节。
  • CookieStore实例表示了实际的cookie存储。在本地上写文中这个属性值的设置优先级高于默认的。

本地的HttpContext对象可以在执行请求之前被用于定制HTTP状态管理上下文,或者在请求执行后检查其状态。也可以使用分离的执行上下文实现每个用户(或每个线程)状态管理。定义在本地上下文的cookie详情记录和cookie存储优先级高于默认设置的级别。

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();
时间: 2024-10-27 05:02:50

HttpClient第三章 HTTP状态管理的相关文章

HttpClient4.3教程 第三章 Http状态管理

HttpClient4.3教程 第三章 Http状态管理 Posted on 2013 年 10 月 13 日 最初,Http被设计成一个无状态的,面向请求/响应的协议,所以它不能在逻辑相关的http请求/响应中保持状态会话.由于越来越多的系统使用http协议,其中包括http从来没有想支持的系统,比如电子商务系统.因此,http支持状态管理就很必要了. 当时的web客户端和服务器软件领先者,网景(netscape)公司,最先在他们的产品中支持http状态管理,并且制定了一些专有规范.后来,网景

HttpClient 4.3.6 教程 第3章 HTTP状态管理 【翻译】

转载:http://blog.csdn.net/lianghongge/article/details/42027069 第3章 HTTP状态管理 最初的HTTP被设计成以状态.请求/应答为导向的协议,它被制作成是没有特殊条款的,以便在状态会话中能交换逻辑关系请求/应答.HTTP协议越来越受欢迎和被采用,越来越多的系统会在应用程序里使用它,这是以前所没有想过的,例如电子商务应用程序.因此,对状态管理的支持就十分有必然了. (Netscape Communications)网景公司是当时web客户

第三章 虚拟化 &nbsp; 创建管理esxi网络

创建并管理esxi网络 一. (延续上一章的试验环境)检查试验环境 1 检查服务是否开启 2.为方便试验,关闭防火墙 3.添加6块物理网卡(开机前安装) 二. 正式进入管理界面 1.管理界面 2.创建虚拟端口组 3.添加物理网卡(上行链路)uplink 4. 网卡设置(使用高可用AA或者是负载均衡HA) 三.使用标准交换机创建网络 1.创建vmkernel  网络 vmotion迁移端口组  (注意标准式网络,每个vswitch都要设置同样配置) 2.创建vmkernel  网路  iscsi

第三章 進程管理

可以參考<深入Linux內核架構>第二章閱讀筆記. 1. 進程 process 程序本身並不是進程,進程是處於執行期的程序以及相關的資源的總稱.如:可執行代碼段.打開的文件.掛起的信號.內核內部數據.處理器狀態.一個或多個具有內存映射的內存地址空間以及一個或多個執行線程.存放全局變量的數據段等等. 實際上,進程就是正在執行的程序代碼的實時結果. 進程的另一個名字是任務(task) 2. 現代操作系統提供的兩種虛擬機制 虛擬處理器:讓正在分享同一個處理器的多個進程都覺着自己在獨享處理器 虛擬內存

第三章:存储器管理

内存管理: 存储管理的功能: ·内存空间的分配与回收,包括内存的分配和共享 ·地址转换 ·内存空间的扩充 ·存储保护   程序的装入: ·静态重定位 ·动态重定位   程序的链接: ·静态链接 ·装入时动态链接 ·运行时动态链接   逻辑地址空间:   物理地址空间:   内存保护: ·存储键保护 ·上下限保护   静态式连续分配管理方式: ·固定式分区存储管理:内存均等划分 ·可变式分区存储管理:按一定比例划分内存 动态式分配管理: 用多少分多少,时间长了会产生很多碎片   分配算法: ·首次

第三章-项目计划与管理

只有一个软件提供所要求的功能或所需要的服务时才被称为有用的软件.当一个用户使你开始讨论感性上的需求时,一个项目开始了.项目进度描述某个项目的软件开发的整个生命,通过枚举该项目的每个阶段,将每个阶段分解成离散的任务.进度也描述了任务间的相互关系,评估时间.因此进度表实际上是个时间表,显示了任务的开始和结束的时间,以及相关干开发的产品准备完备时间.在分析项目时,我们必须明确的分清里程碑和工作任务的差别.工作任务是一个项目在某个阶段的部分工作,而里程碑则指一段任务的结束——一个特殊的时间点.工作任务是

第三章 MySQL应用管理

MySQL启动与关闭 登录MySQL 学会使用MySQL的帮助命令 如何修改MySQL密码 如何找回丢失的密码 原文地址:https://www.cnblogs.com/pzk7788/p/9427722.html

第三章:学生管理模块

显示学生资料--准备 1.显示学生资料 2.删除学生资料 3.学生主键生成策略 4.添加学生资料 5.修改学生资料 1.显示学生资料 添加测试数据 1 @Test 2 public void testSaveStudents() 3 { 4 //创建配置对象 5 Configuration config=new Configuration().configure(); 6 //创建服务注册对象 7 ServiceRegistry serviceRegistry=new ServiceRegist

HttpClient 教程 (三)

第三章 HTTP状态管理 原 始的HTTP是被设计为无状态的,面向请求/响应的协议,没有特殊规定有状态的,贯穿一些逻辑相关的请求/响应交换的会话.由于HTTP协议变得越来越普 及和受欢迎,越来越多的从前没有打算使用它的系统也开始为应用程序来使用它,比如作为电子商务应用程序的传输方式.因此,支持状态管理就变得非常必要了. 网 景公司,一度成为Web客户端和服务器软件开发者的领导方向,在它们基于专有规范的产品中实现了对HTTP状态管理的支持.之后,网景公司试图通过发布规 范草案来规范这种机制.它们的