文档章节

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

诺岚
 诺岚
发布于 2017/08/30 15:53
字数 1651
阅读 8
收藏 0
点赞 0
评论 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
博文 87
码字总数 143206
作品 0
广州
程序员
关于HttpClient重试策略的研究

原文出处:kingszelda 一、背景 由于工作上的业务本人经常与第三方系统交互,所以经常会使用HttpClient与第三方进行通信。对于交易类的接口,订单状态是至关重要的。 这就牵扯到一系列问题:...

kingszelda ⋅ 04/25 ⋅ 0

聊聊spring cloud gateway的NettyConfiguration

序 本文主要研究下spring cloud gateway的NettyConfiguration NettyConfiguration spring cloud gateway使用的是reactor的httpclient,其通过nettyClientOptions这个bean来进行构造options,......

go4it ⋅ 06/03 ⋅ 0

使用httpClient 调起https url接口

遇到的问题* 1、ssl证书信任,解决方式信任所有证书 2、生成请求体调用httpPost.setEntity()时输出的参数格式有误,有多种Entity可以选择(常用 StringEntity、UrlEncodedFormEntity、FileE...

梦魂清风 ⋅ 05/10 ⋅ 0

Httpclient报Timeout waiting for connection from pool 异常

下面这段代码在定时一分钟的任务里面执行: public String remoteJsonUTF8(String url) { HttpGet get = null; CloseableHttpResponse response = null; String json = null; CloseableHttpCl......

小小的小小snake ⋅ 05/17 ⋅ 0

大家都用什么工具发起http请求的呢?

我以前喜欢用apache的 httpClient ,公司用jersey。听经理说jersey的性能好,是真的吗?我在网上并没有搜到相关的性能比较,java9也带了一个httpClient,不知性能对比起来又如何?...

暗中观察 ⋅ 04/22 ⋅ 0

聊聊spring cloud的PreserveHostHeaderGatewayFilter

序 本文主要研究下spring cloud gateway的PreserveHostHeaderGatewayFilter GatewayAutoConfiguration spring-cloud-gateway-core-2.0.0.RC2-sources.jar!/org/springframework/cloud/gatew......

go4it ⋅ 06/14 ⋅ 0

聊聊spring cloud gateway的streaming-media-types属性

序 本文主要研究下spring cloud gateway的streaming-media-types属性 配置 配置说明 GatewayProperties spring-cloud-gateway-core-2.0.0.RC2-sources.jar!/org/springframework/cloud/gatew......

go4it ⋅ 06/07 ⋅ 0

聊聊spring cloud gateway的RemoveHopByHopHeadersFilter

序 本文主要研究一下spring cloud gateway的RemoveHopByHopHeadersFilter GatewayAutoConfiguration spring-cloud-gateway-core-2.0.0.RC1-sources.jar!/org/springframework/cloud/gateway......

go4it ⋅ 05/30 ⋅ 0

Atitit webdav大文件上传的解决方案

Atitit webdav大文件上传的解决方案 目录 1.1. 修改本地电脑注册表无效 1 1.2. 只好使用java lib模式了 jackrabbit.webdav 2 2. ref 4 Upload file thro webdav client java api [if !suppor...

ati艾龙AttilaxAkb ⋅ 06/13 ⋅ 0

聊聊spring cloud gateway的LoadBalancerClientFilter

序 本文主要研究一下spring cloud gateway的LoadBalancerClientFilter GatewayLoadBalancerClientAutoConfiguration spring-cloud-gateway-core-2.0.0.RELEASE-sources.jar!/org/springfram......

go4it ⋅ 前天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

从 Confluence 5.3 及其早期版本中恢复空间

如果你需要从 Confluence 5.3 及其早期版本中的导出文件恢复到晚于 Confluence 5.3 的 Confluence 中的话。你可以使用临时的 Confluence 空间安装,然后将这个 Confluence 安装实例升级到你现...

honeymose ⋅ 今天 ⋅ 0

Java8新增的DateTimeFormatter与SimpleDateFormat的区别

两者最大的区别是,Java8的DateTimeFormatter也是线程安全的,而SimpleDateFormat并不是线程安全。 在并发环境下使用SimpleDateFormat 为了能够在多线程环境下使用SimpleDateFormat,有这三种...

人觉非常君 ⋅ 今天 ⋅ 0

多线程如何控制执行顺序

线程的生命周期说明: 当线程被创建并启动以后,它既不是一启动就进入了执行状态,也不是一直处于执行状态,在线程的生命周期中,它要经过新建(New)、就绪(Runnable)、运行(Running)、...

MarinJ_Shao ⋅ 今天 ⋅ 0

用ZBLOG2.3博客写读书笔记网站能创造今日头条的辉煌吗?

最近两年,著名的自媒体网站今日头条可以说是火得一塌糊涂,虽然从目前来看也遇到了一点瓶颈,毕竟发展到了一定的规模,继续增长就更加难了,但如今的今日头条规模和流量已经非常大了。 我们...

原创小博客 ⋅ 今天 ⋅ 0

MyBatis四大核心概念

本文讲解 MyBatis 四大核心概念(SqlSessionFactoryBuilder、SqlSessionFactory、SqlSession、Mapper)。 MyBatis 作为互联网数据库映射工具界的“上古神器”,训有四大“神兽”,谓之:Sql...

waylau ⋅ 今天 ⋅ 0

以太坊java开发包web3j简介

web3j(org.web3j)是Java版本的以太坊JSON RPC接口协议封装实现,如果需要将你的Java应用或安卓应用接入以太坊,或者希望用java开发一个钱包应用,那么用web3j就对了。 web3j的功能相当完整...

汇智网教程 ⋅ 今天 ⋅ 0

2个线程交替打印100以内的数字

重点提示: 线程的本质上只是一个壳子,真正的逻辑其实在“竞态条件”中。 举个例子,比如本题中的打印,那么在竞态条件中,我只需要一个方法即可; 假如我的需求是2个线程,一个+1,一个-1,...

Germmy ⋅ 今天 ⋅ 0

Django第一期

安装Django 去https://www.djangoproject.com/download/ 下载最新版的Django,然后解压放到Anaconda\Lib\site-packages目录下,然后cmd进入此目录,输入安装命令: python setup.py install ...

大不了敲一辈子代码 ⋅ 今天 ⋅ 0

Springboot2 之 Spring Data Redis 实现消息队列——发布/订阅模式

一般来说,消息队列有两种场景,一种是发布者订阅者模式,一种是生产者消费者模式,这里利用redis消息“发布/订阅”来简单实现订阅者模式。 实现之前先过过 redis 发布订阅的一些基础概念和操...

Simonton ⋅ 今天 ⋅ 0

error:Could not find gradle

一.更新Android Studio后打开Project,报如下错误: Error: Could not find com.android.tools.build:gradle:2.2.1. Searched in the following locations: file:/D:/software/android/andro......

Yao--靠自己 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部