文档章节

HttpClient 中文官方教程----第3章HTTP状态管理-只收录,未测试

诺岚
 诺岚
发布于 2017/08/30 15:53
字数 1651
阅读 9
收藏 0


第3章HTTP状态管理

最初HTTP被设计为无状态的,面向请求/响应的协议,对于跨多个逻辑相关的请求/响应交换的有状态会话没有特别规定。随着HTTP协议的普及和采用越来越多的系统开始将其用于应用程序,它从来不用于例如电子商务应用的传输。因此,对国家管理的支持成为必要。

Netscape Communications当时是网络客户端和服务器软件的领先开发商,它们基于专有规范实现了对其产品中HTTP状态管理的支持。后来,Netscape试图通过发布规范草案来规范机制。这些努力有助于通过RFC标准轨道定义的正式规范。然而,大量应用程序中的国家管理仍然主要基于Netscape草案,与官方规范不兼容。Web浏览器的所有主要开发人员都被迫保持与这些应用程序的兼容性,从而大大有助于标准兼容性的分散。

3.1。HTTP Cookie

HTTP cookie是HTTP代理和目标服务器可以进行交换以维护会话的令牌或短信息状态信息。Netscape工程师曾经把它称为“魔术饼干”,名字卡住了。

HttpClient使用该Cookie接口来表示一个抽象的cookie令牌。在最简单的形式中,HTTP cookie只是一个名称/值对。通常,HTTP cookie还包含许多属性,例如一个有效的域,一个指定该cookie适用的源服务器上的URL子集的路径以及cookie有效的最长时间段。

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

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

  • 解析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)的(mis)行为。请不要在新的应用程序中使用。

  • 默认值: 默认cookie策略是根据基于HTTP响应发送的cookie的属性(如版本属性,现在已过时)的RFC 2965,RFC 2109或Netscape草案兼容实现的合成策略。此政策将不利于下一个次要版本的HttpClient中的标准(RFC 6265兼容)实现。

  • 忽略Cookie: 所有Cookie都被忽略。

强烈建议在新应用程序中使用StandardStandard strict策略。只能使用过时的规格与旧系统兼容。支持过时的规范将在下一个主要版本的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存储的任何物理表示。CookieStore调用的默认实现BasicCookieStore是一个由a支持的简单实现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将以下状态管理相关对象添加到执行上下文中:

  • Lookup代表实际的cookie规范注册表的实例。在本地上下文中设置的此属性的值优先于默认值。

  • CookieSpec 表示实际的cookie规范。

  • CookieOrigin 代表原始服务器的实际细节的实例。

  • CookieStore代表实际的cookie存储的实例。在本地上下文中设置的此属性的值优先于默认值。

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

© 著作权归作者所有

共有 人打赏支持
诺岚
粉丝 0
博文 96
码字总数 169868
作品 0
广州
程序员
Android:HttpClient研究

HttpClient4 用法 由HttpClient3 升级到 HttpClient_4 必看 摘要:HttpClient程序包是一个实现了 HTTP 协议的客户端编程工具包,要想熟练的掌握它,必须熟悉HTTP协议。一个最简单的调用如下:...

boonya
2015/03/27
0
2
httpClient4.2官方文档研究

前言 超文本传输协议(HTTP)也许是最常用的在互联网上使用的协议。 Web服务,支持网络设备和网络计算的增长继续扩大用户驱动的Web浏览器的HTTP协议之外的作用,同时增加了一些应用程序需要H...

harries
2015/08/24
0
0
HttpClient_4 用法 由HttpClient_3 升级到 HttpClient_4 必看

HttpClient程序包是一个实现了 HTTP 协议的客户端编程工具包,要想熟练的掌握它,必须熟悉 HTTP协议。一个最简单的调用如下:

落落的月
2012/05/11
0
0
读书《HttpClient 教程》

读书《HttpClient 教程》 前言 尽管java.net包提供了基本通过HTTP访问资源的功能,但它没有提供全面的灵活性和其它很多应用程序需要的功能。HttpClient就是寻求弥补这项空白的组件,通过提供...

放个屁
2015/05/04
0
0
HttpClient4.3教程 第二章 连接管理

HttpClient4.3教程 第二章 连接管理 2.1.持久连接 两个主机建立连接的过程是很复杂的一个过程,涉及到多个数据包的交换,并且也很耗时间。Http连接需要的三次握手开销很大,这一开销对于比较...

youthflies
2013/10/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Ubuntu18.04 显卡GF-940MX安装NVIDIA-390.77

解决办法: 下面就给大家一个正确的姿势在Ubuntu上安装Nvidia驱动: (a)首先去N卡官网下载自己显卡对应的驱动:www.geforce.cn/drivers (b)下载后好放在英文路径的目录下,怎么简单怎么来...

AI_SKI
今天
1
0
深夜胡思乱想

魔兽世界 最近魔兽世界出了新版本, 周末两天升到了满级,比之前的版本体验好很多,做任务不用抢怪了,不用组队打怪也是共享拾取的。技能简化了很多,哪个亮按哪个。 运维 服务器 产品 之间的...

Firxiao
今天
1
0
MySQL 8 在 Windows 下安装及使用

MySQL 8 带来了全新的体验,比如支持 NoSQL、JSON 等,拥有比 MySQL 5.7 两倍以上的性能提升。本文讲解如何在 Windows 下安装 MySQL 8,以及基本的 MySQL 用法。 下载 下载地址 https://dev....

waylau
今天
0
0
微信第三方平台 access_token is invalid or not latest

微信第三方开发平台code换session_key说的特别容易,但是我一使用就带来无穷无尽的烦恼,搞了一整天也无济于事. 现在记录一下解决问题的过程,方便后来人参考. 我遇到的这个问题搜索了整个网络也...

自由的开源
今天
3
0
openJDK之sun.misc.Unsafe类CAS底层实现

注:这篇文章参考了https://www.cnblogs.com/snowater/p/8303698.html 1.sun.misc.Unsafe中CAS方法 在sun.misc.Unsafe中CAS方法如下: compareAndSwapObject(java.lang.Object arg0, long a......

汉斯-冯-拉特
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部