HTTP状态管理

最初,Htt被设计成一个无状态的面向请求响应的协议,所以它不能再逻辑相关的http请求/响应中保持状态会话。
由于越来越多的系统使用http协议,其中包括http从来没有想支持的系统,比如电子商务系统。因此http支持状态管理就很必要了。 HttpCookie 是一个标记或者状态信息包,HTTP代理人和服务器可以通过传输它来保持一个回话。
HttpClient使用Cookie接口去表现一个抽象的cookie标记。在这个最简单的Http cookie结构中有一对名字/值(name)。
通常一个HTTP cookie也包含许多属性,如版本,有效的域名,在源服务器上的给cookie引擎所指定的URLs子集的路径,最大的cookie有效期。
setCookie 接口表现一个set-cookie应答标头,它会被源服务器发送给HTTP代理人,为了保持一个回话状态。
setCookie2接口是setCookie的扩展,它增加了一些特殊的方法。 ClientCookie接口扩展了Cookie接口,它加入了额外的客户端功能,如能够完全的恢复原始的cookie属性,就像被源服务器指定的一样。
对于生成Cookie标头是十分重要的,因为一些cookie规格请求,只有当它们被Set-Cookie或者set-cookie2标头规定时,Cookie标头应该包含确定的属性。

HTTP cookies

   HTTP cookie是HTTP客户端和服务器端之间交互的一小段状态信息或者标记用于维持一个回话信息,Netscape工程师用一个魔法饼干来形容它,而这一个名称就被保留下来了。
HttpClient使用Cookie接口用来表示抽象的cookie标记,HTTP cookie最简单的形式就是一个键值对,通常HTTP cookie包含一系列属性比如合法域名,cookie可以被接受的URL的子集,cookie保存的最大时间。
SetCookie接口代表Set-Cookie response头消息,该消息从服务器端发送给客户端用于保持一个回话状态。
ClientCookie接口继承自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 attribute exactly as sent by the server
cookie.setAttribute(ClientCookie.PATH_ATTR,"/");
cookie.setAttribute(ClientCookie.DOMAIN.ATTR,".mycompany.com");

cookie的规范

cookieSpec代表了cookie管理的规范,cookie管理规范包含以下内容:


解析Set-Cookie头部的规则
验证已经解析cookie的规则
为已给定主机,端口和源路径格式化Cookie头部

Httpclient 有如下几种CookieSpec的实现

Netscape draft
(网景草案):一个顺应了网景公司早期发行的草案的规范。它对兼容传统的代码来说是不可或缺的;
Standard
(标准的):RFC 2965 HTTP 状态管理规范;
Standard strict
(严格):状态管理策略行为完全符合RFC6265第四章的行为定义。
Browser compatibility
(浏览器兼容):这个实现尝试努力去模仿普通浏览器(如IE和火狐)的行为。
Best match
(最好的匹配):'Meta' cookie规范,它是一个以发送HTTP应答结构作为依据捡起cookie策略。它的所有实现都集中在一个类(class)里。
Ignore cookies
(忽略cookies) :所有cookie被忽略掉。 强烈建议使用Best Match策略让HttpClient以执行上下文(execution context) 作为依据来捡起一个适当的级别。

选择cookie的策略

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

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

自定义cookie策略

为了实现自定义的cookie策略需要实现CookieSpec定制接口,创建一个CookieSpecProvider的实现以创建初始化定制的规范,最后注册进HttpClient里。

一旦自定义的规范被注册,它就能以标准的cookie规范相同的方式被激活。

CookieSpecProvider easySpecProvider = new CookieSpecProvider(){
public CookieSpec create(HttpContext context){
return new BrowserCompatSpec(){
@Overrider
public void validate(Cookie cookie, CookieOrigin origin) throwsMalformedCookieException{
// oh , i am easy
}
};
}
}; Registry<CookieSpecProvider> r = RegisterBuilder<CookieSpecProvider> create()
.register(CookieSpecs.BEST_MATCH,new BestMatchSpecFactory())
.register(CookieSpecs.BROWSER_COMPATIBILITY, new BestCompatSpecFactory())
.register("easy","easySpecProvider")
.build();
RegistryConfig requestConfig = RequestConfig.custom()
.setCookieSpec("easy")
.build();
CloseableHttpClient httpClient = HttpClients.custom()
.setDefaultCookieSpecRegistry(r)
.setDefaultReqeustConfig(requestConfig)
.build();

Cookie的持久性

Httpclient可通过实现CookieStor的接口以支持任意物理表述的持久性cookie仓库。
默认情况下,cookieStore的实现会调用CookieStore(一个简单的被java.util.ArrayList所支持的实现)。
当容器对象执行垃圾回收时,存储在BasicClientCookie对象里的cookies就会丢失,如果有需要,用户可以提供更复杂的实现。
//创建本地cookie的仓库实例
CookieStore cookieStore = new BasicCookieStore();
//信息填入cookies
BasicClientCookie cookie = new BasicClientCookie("name","value");
cookie.setVersion(0);
cookie.setDomain("www.mycompany.com");
cookie.setPath("/");
cookieStore.addCookie("cookie");
//设置cookie的信息
CloseableHttpClient httpclient = HttpClients.custom()
.setDefaultCookieStore(cookieStore)
.build();

http状态管理和执行上下文

在HTTP请求执行过程中,Httpclient加入了一下状态管理相关的对象去执行上下文:
Lookup实例代理实际的cookie规范注册表。这个属性的值在本地上下文件里面优先于默认的
CookieSpec代表实际的cookie规格
CookieOrigin 代表实际的关于源服务器的详细信息
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 uesd
CookieSpec cookieSpec = context.getCookieSpec();

httpclient http状态管理的更多相关文章

  1. HttpClient_HttpClient 4.3.6 HTTP状态管理

    HTTP状态管理 最初的HTTP被设计成以状态.请求/应答为导向的协议,它被制作成是没有特殊条款的,以便在状态会话中能交换逻辑关系请求/应答.HTTP协议越来越受欢迎和被采用,越来越多的系统会在应用程 ...

  2. Part2-HttpClient官方教程-Chapter3-HTTP状态管理

    ps:近日忙于课设与一个赛事的准备....时间真紧啊~~ 最初,HTTP被设计为一种无状态的,面向请求/响应的协议,它并没有为跨越多个逻辑相关的请求/响应交换的有状态会话做出特殊规定.随着HTTP协议 ...

  3. HttpClient-03Http状态管理

    最初,Http被设计成一个无状态的,面向请求/响应的协议,所以它不能在逻辑相关的http请求/响应中保持状态会话.由于越来越多的系统使用http协议,其中包括http从来没有想支持的系统,比如电子商务 ...

  4. Blazor+Dapr+K8s微服务之状态管理

    1         状态管理服务器端接口 1.1         添加Dapr.AspNetCore包 在DaprTest1.Server项目中添加Dapr.AspNetCore包,该包实现了ASP. ...

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

    最初,Http被设计成一个无状态的,面向请求/响应的协议,所以它不能在逻辑相关的http请求/响应中保持状态会话.由于越来越多的系统使用http协议,其中包括http从来没有想支持的系统,比如电子商务 ...

  6. Redux状态管理方法与实例

    状态管理是目前构建单页应用中不可或缺的一环,也是值得花时间学习的知识点.React官方推荐我们使用Redux来管理我们的React应用,同时也提供了Redux的文档来供我们学习,中文版地址为http: ...

  7. 表格搞定 Asp.net Web 状态管理

    最近在网上搜罗了 ASP.NET WEB 状态管理方面的一些内容,终于把这些内容整合总结了一下. 1. 希望自己通过整理,能够掌握一些,为自己投资. 2. 以便自己忘记,又要浪费时间搜罗. 3. 希望 ...

  8. [译]面向初学者的Asp.Net状态管理技术

    介绍 本文主要讲解Asp.Net应用程序中的状态管理技术(Asp.Net中有多种状态管理技术),并批判性地分析所有状态管理技术的优缺点. 背景 HTTP是无状态的协议.客户端发起一个请求,服务器响应完 ...

  9. [Asp.Net]状态管理(Session、Application、Cache)

    上篇博文介绍了在客户端状态管理的两种方式:http://www.cnblogs.com/wolf-sun/p/3329773.html.除了在客户端上保存状态外,还可以在服务器上保存状态.使用客户端的 ...

随机推荐

  1. Educational Codeforces Round 21 Problem D(Codeforces 808D)

    Vasya has an array a consisting of positive integer numbers. Vasya wants to divide this array into t ...

  2. stl string 使用(转载)

    出处:http://www.cnblogs.com/lzjsky/archive/2011/01/23/1942508.html 1. 查找字符 std::wstring strData = L&qu ...

  3. sublimeText3最新教程-自带插件汉化(sublime-text_build-3175_amd64)

    一.可用注册码 1.更改dns 在linux下的目录是     /etc/hosts 在win7中,hosts文件的位置:C:\Windows\System32\drivers\etc 127.0.0 ...

  4. linux下设置软件使用socks5代理

    1.为wget使用代理,可以直接修改/etc/wgetrc,也可以在主文件夹下新建.wgetrc,并编辑相应内容,本文采用后者. 直接往~/.wgetrc(自行创建此文件)添加如下内容: https_ ...

  5. FJUT 奇怪的数列(线性选择算法)题解

    题意:找出无需数列中位数(偶数为两个中位数平均数向下取整) 思路:用nth_element(a + first,a + k,a+ end + 1)找出中位数,复杂度一般为O(n).这个STL能将 [ ...

  6. UVa 10118 免费糖果(记忆化搜索+哈希)

    https://vjudge.net/problem/UVA-10118 题意: 桌上有4堆糖果,每堆有N颗.佳佳有一个最多可以装5颗糖的小篮子.他每次选择一堆糖果,把最顶上的一颗拿到篮子里.如果篮子 ...

  7. [ios]object-c math.h里的数学计算公式介绍

    参考:http://blog.csdn.net/yuhuangc/article/details/7639117 头文件:<math.h> 1. 三角函数  double sin (dou ...

  8. spring boot 邮件发送(带附件)

    首先开启QQ邮箱的POP.SMTP服务器,获取授权码. 设置-->账户-->POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务 pom.xml需要加载三个ja ...

  9. 4-12 如何搜索API

    遇到一个参数prompt,使用rails ,API没有找到,怎么办? site关键字 在全网搜索 或者google一下,或是在stack overflow 上找答案 prompt 是FormOptio ...

  10. Java 的对象和类

    Java 是一种面向对象的语言.作为一个面向的语言,Java 具有面向对象的特性,Java 能够支持下面的一些基本概念 − 多态(Polymorphism) 继承(Inheritance) 封装(En ...