HttpClient 中文官方教程----第3章HTTP状态管理-只收录,未测试
第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都被忽略。
强烈建议在新应用程序中使用Standard
或Standard 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();
转载于:https://my.oschina.net/ch66880/blog/1526207