ps:近日忙于课设与一个赛事的准备。。。。时间真紧啊~~

  最初,HTTP被设计为一种无状态的,面向请求/响应的协议,它并没有为跨越多个逻辑相关的请求/响应交换的有状态会话做出特殊规定。随着HTTP协议越来越流行,越来越多的系统开始将其用于应用程序,它从来没有打算用于电子商务应用程序的传输。因此,对国家管理的支持成为必然。

  当时,网景通信是一家领先的网络客户端和服务器软件开发商,它们在其产品基于专有规范的基础上实现了对HTTP状态管理的支持。后来,Netscape试图通过发布规范草案来标准化机制。这些努力有助于通过RFC标准轨道定义的正式规范。但是,大量应用程序中的状态管理仍然主要基于Netscape草案,并且与官方规范不兼容。网络浏览器的所有主要开发者都不得不保持与这些应用程序的兼容性,这些应用程序极大地促成了标准遵从性的分裂。

3.1. HTTP cookies  

  HTTP cookie是HTTP代理和目标服务器可以交换来维护会话的令牌。网景工程师曾经把它称为“魔法饼干”。

  

  HttpClient使用Cookie接口来表示一个抽象的cookie标记。 HTTP最简单的形式就是一个键值对。通常,HTTP cookie还包含许多属性,例如有效的域,指定应用此cookie的源服务器上URL的子集的路径以及cookie有效的最长时间。

  SetCookie接口表示由原始服务器发送给HTTP代理的一个Set-Cookie响应头,以保持对话状态。

  ClientCookie接口扩展了Cookie接口和额外的客户端特定功能,比如能够完全按照原始服务器指定的方式检索原始Cookie属性。这对生成Cookie标题很重要,因为某些Cookie规范要求Cookie标题只有在Set-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管理规范预计将执行:

  • 解析Set-Cookie标题的规则。
  • 分析的cookie的验证规则。
  • 给定的主机,端口和原始路径的Cookie头的格式。

HttpClient附带几个CookieSpec实现:

  • 标准严格:状态管理策略符合RFC 6265第4节定义的良好行为配置文件的语法和语义。
  • 标准:状态管理策略符合由RFC 6265第4节定义的更宽松的配置文件,该配置文件旨在与不符合良好行为的配置文件的现有服务器进行互操作。
  • Netscape草案(过时):此政策符合Netscape Communications发布的原始草案规范。除非绝对有必要与遗留代码兼容,否则应该避免。
  • RFC 2965(过时):符合RFC 2965定义的过时状态管理规范的状态管理策略。请勿在新应用程序中使用。
  • RFC 2109(过时):符合RFC 2109定义的过时状态管理规范的状态管理策略。请不要在新的应用程序中使用。
  • 浏览器兼容性(过时):此政策致力于模仿老版本浏览器应用程序(如Microsoft Internet Explorer和Mozilla FireFox)的(错误)行为。请不要在新的应用程序中使用。
  • 默认:默认cookie策略是一种综合策略,根据与HTTP响应一起发送的cookie的属性(如版本属性,现在已过时),选择符合RFC 2965,RFC 2109或Netscape草案的兼容实现。在下一个次版本的HttpClient中,这个策略将被弃用,以支持标准(符合RFC 6265)实现。
  • 忽略Cookie:所有Cookie都被忽略。

强烈建议在新应用程序中使用标准或严格的严格策略。 过时的规格只能用于与旧系统的兼容性。 对于过时的规范的支持将在下一个主要版本的HttpClient中被删除。

 3.3 选择Cookie策略

可以在HTTP客户端上设置Cookie策略,并根据需要在HTTP请求级别上重写Cookie策略。

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存储的任何物理表示。名为BasicCookieStore的默认CookieStore实现是一个由java.util.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状态管理和执行上下文

在HTTP请求执行过程中,HttpClient将以下与状态管理相关的对象添加到执行上下文中:

  • 代表实际的cookie规范注册表的Lookup实例。 在本地上下文中设置的这个属性的值优先于defult。
  • 表示实际Cookie规范的CookieSpec实例。
  • 代表原始服务器的实际细节的CookieOrigin实例。
  • 代表实际Cookie存储的CookieStore实例。 在本地上下文中设置的这个属性的值优先于默认值。

本地HttpContext对象可用于在请求执行之前自定义HTTP状态管理上下文,或在请求执行后检查其状态。 也可以使用单独的执行上下文来实现每个用户(或每个线程)的状态管理。 在本地上下文中定义的cookie规范注册表和cookie存储将优先于在HTTP客户端级别设置的默认规则

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

Part2-HttpClient官方教程-Chapter3-HTTP状态管理的更多相关文章

  1. HttpClient_HttpClient 4.3.6 HTTP状态管理

    HTTP状态管理 最初的HTTP被设计成以状态.请求/应答为导向的协议,它被制作成是没有特殊条款的,以便在状态会话中能交换逻辑关系请求/应答.HTTP协议越来越受欢迎和被采用,越来越多的系统会在应用程 ...

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

    最初,Http被设计成一个无状态的,面向请求/响应的协议,所以它不能在逻辑相关的http请求/响应中保持状态会话.由于越来越多的系统使用http协议,其中包括http从来没有想支持的系统,比如电子商务 ...

  3. httpclient http状态管理

    HTTP状态管理 最初,Htt被设计成一个无状态的面向请求响应的协议,所以它不能再逻辑相关的http请求/响应中保持状态会话. 由于越来越多的系统使用http协议,其中包括http从来没有想支持的系统 ...

  4. Unity性能优化(3)-官方教程Optimizing garbage collection in Unity games翻译

    本文是Unity官方教程,性能优化系列的第三篇<Optimizing garbage collection in Unity games>的翻译. 相关文章: Unity性能优化(1)-官 ...

  5. Unity性能优化(2)-官方教程Diagnosing performance problems using the Profiler window翻译

    本文是Unity官方教程,性能优化系列的第二篇<Diagnosing performance problems using the Profiler window>的简单翻译. 相关文章: ...

  6. 详解 “Android UI”设计官方教程

    我们曾经给大家一个<MeeGo移动终端设备开发UI设计基础教程>,同时很多朋友都在寻找Android UI开发的教程,我们从Android的官方开发者博客找了一份幻灯片,介绍了一些Andr ...

  7. [Full-stack] 状态管理技巧 - Redux

    资源一: In React JS Tutorials, lectures from 9. From: React高级篇(一)从Flux到Redux,react-redux 从Flux到Redux,再到 ...

  8. Web前端的状态管理

    背景 我相信很多朋友跟我一样,初次听到什么 Flux ,  Redux ,  Vuex , 状态管理 的时候是一脸懵逼的.因为在外面之前前端大部分开发的时候,根本没有那么多的概念.自从ReactJS火 ...

  9. DroidParts 中文系列教程(基于官方教程)

    DroidParts中文系列教程(基于官方教程) (一)DroidParts框架概况 2014年4月18日星期五 11:36 他是一个精心构造的安卓框架,包括下面这些基本功能 DI依赖注入,可以注入V ...

随机推荐

  1. 火狐浏览器(FireFox)安装Flash插件失败处理方法

    最近不知道怎么了,总是嫌弃IE,可能是被网络流量监测的网址给搞得了,弄了火狐浏览器,也安装了猎豹,这里不对浏览器做评价 好多朋友安装好火狐(FireFox)的时候发现之前不是有装IE的Flash播放插 ...

  2. docker使用记录

    1.安装(开始前要注意系统内核版本是否合适,建议用7以上的系统吧,少点坑) //安装docker yum -y install docker-io //启动 service docker start ...

  3. android eclipse 添加libs文件夹

    导入一个项目发现没有libs文件夹,后来z自己新建了个lib文件夹,但是总是不行,后来发现错了,应该是libs文件夹.建完了之后,系统会自动在build path中把这个文件夹添加进来的:个人无须操作

  4. [Leetcode] 3.Longest Substring Without Repeating Characters(unordered_map)

    通过把未访问的结点放到unordered_map中来判断是否重复,代码如下: class Solution { public: int lengthOfLongestSubstring(string ...

  5. DELPHI的MEMO组件

    位于Standard选项卡上,它是对EDIT控件的扩展,可以对多行文本进行显示.输入 和编辑. Lines属性: 该属性实际上为TStrings类型的对象,用来存放Memo对象的文本 TStrings ...

  6. 【bzoj1688】[USACO2005 Open]Disease Manangement 疾病管理 状态压缩dp+背包dp

    题目描述 Alas! A set of D (1 <= D <= 15) diseases (numbered 1..D) is running through the farm. Far ...

  7. Android UI设计的基本元素有哪些

    在android app开发如火如荼的今天,如何让自己的App受人欢迎.如何增加app的下载量和使用量....成为很多android应用开发前,必须讨论的问题.而ui设计则是提升客户视觉体验度.提升下 ...

  8. .Net MVC 实现长轮询

    什么是长轮询? 长轮询是“服务器推”技术实现方式的一种,可以将服务端发生的变化实时传送到客户端而无须客户端频繁的地刷新.发送请求. 长轮询原理? 客户端向服务器发送Ajax请求,服务器接收到请求后,保 ...

  9. Linux特殊字符含义

    文件名以 ' . ' 开头的都是隐藏文件或目录,只需要在文件或目录名前添加 ' . ' 就可以隐藏它 ~               表示主目录 .                当前目录 . .  ...

  10. Codeforces VK Cup 2015 A.And Yet Another Bracket Sequence(后缀数组+平衡树+字符串)

    这题做得比较复杂..应该有更好的做法 题目大意: 有一个括号序列,可以对其进行两种操作: ·        向里面加一个括号,可以在开头,在结尾,在两个括号之间加. ·        对当前括号序列进 ...