文档章节

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

诺岚
 诺岚
发布于 2017/08/30 15:53
字数 1651
阅读 11
收藏 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
博文 106
码字总数 185320
作品 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和Jsoup快捷抓取和分析页面

最近在写一个小爬虫,准备爬一部分网页数据,来做模型训练,在考虑如何抓取网页及分析网页时,参考了OSC站中一些项目,特别是@黄亿华写的《webmagic的设计机制及原理-如何开发一个Java爬虫》...

仪山湖
2013/09/03
13K
1
HttpClient_4 用法 由HttpClient_3 升级到 HttpClient_4 必看

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

落落的月
2012/05/11
0
0
解决HttpClient的FilePart上传文件中使用中文名称文件名乱码问题

String targetUrl = "http://localhost:8080/Test";

zenith
2010/06/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

微服务分布式事务实现

https://www.processon.com/view/link/5b2144d7e4b001a14d3d2d30

WALK_MAN
今天
2
0
《大漠烟尘》读书笔记及读后感文章3700字

《大漠烟尘》读书笔记及读后感文章3700字: 在这个浮躁的社会里,你有多久没有好好读完一本书了? 我们总觉得自己和别人不一样,所以当看到别人身上的问题时,很少有“反求诸己”,反思自己。...

原创小博客
今天
4
0
大数据教程(9.5)用MR实现sql中的jion逻辑

上一篇博客讲解了使用jar -jar的方式来运行提交MR程序,以及通过修改YarnRunner的源码来实现MR的windows开发环境提交到集群的方式。本篇博主将分享sql中常见的join操作。 一、需求 订单数据表...

em_aaron
今天
3
0
十万个为什么之什么是resultful规范

起源 越来越多的人开始意识到,网站即软件,而且是一种新型的软件。这种"互联网软件"采用客户端/服务器模式,建立在分布式体系上,通过互联网通信,具有高延时(high latency)、高并发等特点...

尾生
今天
3
0
Terraform配置文件(Terraform configuration)

Terraform配置文件 翻译自Terraform Configuration Terraform用文本文件来描述设备、设置变量。这些文件被称为Terraform配置文件,以.tf结尾。这一部分将讲述Terraform配置文件的加载与格式。...

buddie
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部