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

转载:http://blog.csdn.net/lianghongge/article/details/42027069

第3章 HTTP状态管理

最初的HTTP被设计成以状态、请求/应答为导向的协议,它被制作成是没有特殊条款的,以便在状态会话中能交换逻辑关系请求/应答。HTTP协议越来越受欢迎和被采用,越来越多的系统会在应用程序里使用它,这是以前所没有想过的,例如电子商务应用程序。因此,对状态管理的支持就十分有必然了。

(Netscape Communications)网景公司是当时web客户端和服务器软件开发的领航者,在他们的基于专有规格的产品上实现了对HTTP状态管理的支持。后来,网景公司尝试通过出版规格草案去标准化这个机制。这些努力最终通过 theRFC standard track促成了正式的规范定义。然而,应用程序的重要数字仍然是大部分地建立在网景公司那份草案的基础上的,并且和官方的规格不兼容。所有主要的web浏览器开发者感到不得不去保持对这些应用的最大兼容性,进而促进形成了顺从这些标准的碎片。

3.1 HTTP cookies

HTTP cookie是一个标记或者状态信息包, HTTP代理人和服务器可以通过传输它来保持一个会话。网景工程师常常将它称为"magic cookie"。

HttpClient使用Cookie接口去表现一个抽象的cookie标记。在这个最简单的HTTP cookie结构里是一对名字/值(name/value)。通常一个HTTP cookie也包含许多属性,如:版本、有效的域名、在源服务器上的给cookie 宴请所指定URLs子集的路径、最大的cookie有效期。

SetCookie 接口表现一个Set-Cookie应答标头,它会被源服务器发送给HTTP代理人,为了保持一个会话状态。SetCookie2 接口是SetCookie的扩展,它增加了一些特殊的方法。

ClientCookie 接口扩展了Cookie 接口,它加入了额外的客户功能,如能够完全地恢复原始的cookie属性,就像被源服务器指定的一样。这对于生成Cookie标头是十分重要的,因为一些cookie规格请求,只有当它们被Set-Cookie 或Set-Cookie2标头规定时,Cookie标头应该包含确定的属性。

3.1.1 Cookie版本

Cookies兼容网景规范草案,不过不兼容版本为0的官方规范,但标准兼容cookies 版本为1的,HttpClient可能会由于版本的不同而导致处理cookies的方法不一样。

这是一个重构网景cookie的例子:

BasicClientCookie netscapeCookie = new BasicClientCookie("name", "value");
netscapeCookie.setVersion(0);
netscapeCookie.setDomain(".mycompany.com");
netscapeCookie.setPath("/");

这是一个重构标准cookie的例子。请注意,标准兼容cookie必须要保持所有从源服务器发送过来的属性。

BasicClientCookie stdCookie = new BasicClientCookie("name", "value");
stdCookie.setVersion(1);
stdCookie.setDomain(".mycompany.com");
stdCookie.setPath("/");
stdCookie.setSecure(true);
// Set attributes EXACTLY as sent by the server
stdCookie.setAttribute(ClientCookie.VERSION_ATTR, "1");
stdCookie.setAttribute(ClientCookie.DOMAIN_ATTR, ".mycompany.com");

这是一个重构Set-Cookie2cookie兼容cookie的例子。请注意,标准兼容cookie必须要保持所有从源服务器发送过来的属性。

BasicClientCookie2 stdCookie = new BasicClientCookie2("name", "value");
stdCookie.setVersion(1);
stdCookie.setDomain(".mycompany.com");
stdCookie.setPorts(new int[] {80,8080});
stdCookie.setPath("/");
stdCookie.setSecure(true);
// Set attributes EXACTLY as sent by the server
stdCookie.setAttribute(ClientCookie.VERSION_ATTR, "1");
stdCookie.setAttribute(ClientCookie.DOMAIN_ATTR, ".mycompany.com");
stdCookie.setAttribute(ClientCookie.PORT_ATTR, "80,8080");

3.2 Cookie规范

CookieSpec接口代表一个cookie管理规范。Cookie管理规范是要严格执行的:

1、Set-Cookie和任意的Set-Cookie2标头分析规则;

2、分析cookies规则;

3、为指定的主机、端口和源路径格式化Cookie标头。

HttpClient包含几个CookieSpec实现:

1Netscape draft(网景草案):一个顺应了网景公司早期发行的草案的规范。它对兼容传统的代码来说是不可或缺的;

2、Standard(标准的): RFC 2965 HTTP 状态管理规范;

3、Browser compatibility(浏览器兼容):这个实现尝试努力去模仿普通浏览器(如IE和火狐)的行为。

4、Best match(最好的匹配): ‘Meta‘ cookie规范,它是一个以发送HTTP应答结构作为依据捡起cookie策略。它的所有实现都集中在一个类(class)里。

5、Ignore cookies:(忽略cookies) :所有cookie被忽略掉。

强烈建议使用Best Match策略让HttpClient以执行上下文(execution  context) 作为依据来捡起一个适当的级别。

3.3 选择cookie策略

Cookie策略可以被设置,如果有请求,也可以被HTTP请求重载。

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

3.4自定义cookie策略

为了实现自定义的cookie策略需要实现CookieSpec的定制接口,创建一个CookieSpecProvider实现以创建并初始化定制的规范,最后注册进HttpClient里。一旦自定义的规范被注册,它就能以标准的cookie规范相同的方式被激活。

CookieSpecProvider easySpecProvider = new CookieSpecProvider() {

    public CookieSpec create(HttpContext context) {

        return new BrowserCompatSpec() {
            @Override
            public void validate(Cookie cookie, CookieOrigin origin)
                    throws MalformedCookieException {
                // Oh, I am easy
            }
        };
    }

};
Registry<CookieSpecProvider> r = RegistryBuilder.<CookieSpecProvider>create()
        .register(CookieSpecs.BEST_MATCH,
            new BestMatchSpecFactory())
        .register(CookieSpecs.BROWSER_COMPATIBILITY,
            new BrowserCompatSpecFactory())
        .register("easy", 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 的实现会调用CookieStore(一个简单的被java.util.ArrayList所支持的实现)。当容器对象执行垃圾回收时,存储在BasicClientCookie对象里的cookies会丢失。如果有需要,用户可以提供更复杂的实现。

// Create a local instance of cookie store  译:创建本地cookie仓库实例
CookieStore cookieStore = new BasicCookieStore();
// Populate cookies if needed  译:填入cookies
BasicClientCookie cookie = new BasicClientCookie("name", "value");
cookie.setVersion(0);
cookie.setDomain(".mycompany.com");
cookie.setPath("/");
cookieStore.addCookie(cookie);
// Set the store
CloseableHttpClient httpclient = HttpClients.custom()
        .setDefaultCookieStore(cookieStore)
        .build();

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

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

1) Lookup实例代表实际的cookie规范注册表。这个属性的值在本地上下文件里面优先于默认的;

2)CookieSpec代表实际的cookie规格;

3)CookieOrigin 实例代表实际的关于源服务器的详细信息;

4)CookieStore实例代表实际的cookie仓库。这个属性的值在本地上下文件里面优先于默认的。

本地的HttpContext 对象可以在请求执行之前被用来定制HTTP状态管理上下文,或者在请求执行完后检查它的状态。你可以使用分离的执行上下文来实现每个用户(或每个线程)的状态管理。cookie规范注册表和cookie仓库被定义在本地上下文里会比默认的被设置在HTTP客户端(HTTP client)级别里的有更高的优先级。

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

译者:lianghongge

时间: 2024-10-08 04:27:17

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

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

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

HttpClient第三章 HTTP状态管理

原始的HTTP被设置成无状态的面向请求响应的协议,它并没有为基于跨几个逻辑相关的请求/响应交换的有状态会话提供所需的功能.但是随着HTTP协议越来越流行并且被应用,越来越多的系统开始用它作为原本并不是它的作用的功能,例如,电子商务传输应用,这样一来,对于状态管理的支持成为一个必要的功能. 那时网景公司作为一个web客户端和服务器端软件的领导开发者在他们的一个基于特殊的说明的产品里实现了对HTTP状态管理的支持,后来,网景通过发布一个知指导说明书试图标准化这一机制.这些努力促成了通过RFC标准的正

HttpClient 4.3.6教程 第2章 连接管理 【翻译】

第2章 连接管理 2.1 持久连接 一个主机与另一端建立连接是十分复杂的,并且两个终端间要交换多个信息包,这会耗费不少时间.对于低级的HTTP消息来说握手连接是尤其重要的.如果在执行多个请求时重复使用公共的连接,那么就能大大提高数据吞吐率.HTTP/1.1默认允许HTTP连接可以被多个请求复用.HTTP/1.0也兼容终端为了多个请求去使用一个明确的机制来优先保持活跃的连接.HTTP代理也能在一定的同期时间里保持活跃的空闲连接,以免同样的目标主机随后还要请求.这种保持活跃连接的能力通常都会涉及持续

HttpClient 4.3.6教程 第1章 基础 【翻译】

第1章基础 1.1请求执行 HttpClient大部分的基础函数都是在执行HTTP的方法.一个HTTP方法执行包括一个或多个HTTP请求/HTTP应答交换,通常这已经在HttpClient内部操作了. 用户提供一个请求对象,HttpClient将这个请求传输给目标服务器,服务器返回一个相应的应答结构,如果不成功则抛出一个异常. 很自然地,了解HttpClientAPI的切入点是上面阐述里规定的HttpClient接口. 这是一个最简单请求执行例子: CloseableHttpClienthttp

HttpClient 4.3教程 第六章 HTTP缓存

HttpClient 4.3教程 第六章 HTTP缓存 Posted on 2013 年 10 月 28 日 6.1.基本概念 HttpClient的缓存机制提供一个与HTTP/1.1标准兼容的缓存层 – 相当于Java的浏览器缓存.HttpClient缓存机制的实现遵循责任链(Chain of Responsibility)设计原则,默认的HttpClient是没有缓存的,有缓存机制的HttpClient可以用来临时替代默认的HttpClient,如果开启了缓存,我们的请求结果就会从缓存中获取

HttpClient4.3教程 第四章 HTTP认证

HttpClient4.3教程 第四章 HTTP认证 Posted on 2013 年 10 月 17 日 HttpClient既支持HTTP标准规范定义的认证模式,又支持一些广泛使用的非标准认证模式,比如NTLM和SPNEGO. 4.1.用户凭证 任何用户认证的过程,都需要一系列的凭证来确定用户的身份.最简单的用户凭证可以是用户名和密码这种形式.UsernamePasswordCredentials这个类可以用来表示这种情况,这种凭据包含明文的用户名和密码. 这个类对于HTTP标准规范中定义的

HttpClient4.3 教程 第五章 快速API

HttpClient4.3 教程 第五章 快速API Posted on 2013 年 10 月 22 日 5.1.Easy to use facade API HttpClient从4.2开始支持快速api.快速api仅仅实现了HttpClient的基本功能,它只要用于一些不需要灵活性的简单场景.例如,快速api不需要用户处理连接管理和资源释放. 下面是几个使用快速api的例子: // 执行一个get方法,设置超时时间,并且将结果变成字符串 Request.Get("http://www.ye

ArcGIS for Desktop入门教程_第二章_Desktop简介 - ArcGIS知乎-新一代ArcGIS问答社区

原文:ArcGIS for Desktop入门教程_第二章_Desktop简介 - ArcGIS知乎-新一代ArcGIS问答社区 1 Desktop简介 1.1 ArcGIS for Desktop ArcGIS for Desktop是ArcGIS产品线上的桌面端软件产品,为GIS专业人士提供的信息制作和使用的工具.利用ArcGIS for Desktop,你可以实现任何从简单到复杂的GIS任务,包括制图,地理分析,数据编辑,数据管理,可视化和空间处理等.它可以作为三个独立的软件产品购买,每个

ArcGIS for Desktop入门教程_第一章_引言 - ArcGIS知乎-新一代ArcGIS问答社区

原文:ArcGIS for Desktop入门教程_第一章_引言 - ArcGIS知乎-新一代ArcGIS问答社区 1 引言 1.1 读者定位 我们假设用户在阅读本指南前应已具备以下知识: · 熟悉Windows的基本操作 · 接触过地理信息系统的概念 · 理解地理数据的特点 1.2 预期效果 我们期望用户在阅读完本指南后对以下知识有一定的了解: · 了解ArcGIS for Desktop的组成与功能 · 熟悉使用ArcGIS for Desktop进行数据编辑.整饰和输出的流程 · 如何使用