http状态管理

cookie是HTTP代理和目标服务器可以交流保持回话的状态信息的令牌或短包。
httpclient使用Cookie接口来代表抽象的cookie令牌,在它的简单形式中http的cookie是键/值对.
通常一个http的cookie也包含一些属性,比如版本号,合法的域名,指定cookie应用所在的源服务器url子集的路径,cookie的最长有效期
SetCookie接口代表源服务器发送给http代理的响应中的头部信息Set-Cookie来维持一个对话状态
SetCookie2接口和指定Set-Cookie2方法扩展了Set-Cookie
SetCookie接口和额外的如获取原始cookie属性的能力,就像他们由源服务器指定的客户端特定功能扩展了Cookie接口。
这对生成Cookie头部很重要,因为一些cookie规范需要
Cookie头部应该包含在Set-Cookie或Set-Cookie2头部指定的特定属性

cookie版本

Cookie兼容网景公司的草案标准,但是版本0被认为是不符合官方规范的。
符合标准的cookie的期望版本是1.
httpclient可以处理基于不同版本的cookie

BasicClientCookie netscapeCookie = new BasicClientCookie("name","value");
netscapeCookie.setVersion(0);
netscapeCookie.setDomain("127.0.0.1");
netscapeCookie.setPath("/");
----
重新创建标准cookie,标准cookie必须保留由源服务器发送的所有属性
BasicClientCookie stdCookie = new BasicClientCookie("name", "value");
stdCookie.setVersion(1);
stdCookie.setDomain(".mycompany.com");
stdCookie.setPath("/");
stdCookie.setSecure(true);
// 精确设置由服务器发送的属性
stdCookie.setAttribute(ClientCookie.VERSION_ATTR, "1");
stdCookie.setAttribute(ClientCookie.DOMAIN_ATTR, ".mycompany.com");
-----------
重新创建Set-Cookie2兼容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);
// 精确设置由服务器发送的属性
stdCookie.setAttribute(ClientCookie.VERSION_ATTR, "1");
stdCookie.setAttribute(ClientCookie.DOMAIN_ATTR, ".mycompany.com");
stdCookie.setAttribute(ClientCookie.PORT_ATTR, "80,8080");

cookie规范

CookieSpec接口代表了cookie管理的规范。
*) 解析Set-Cookie规则还有可选的Set-Cookie2头部信息
*) 验证解析cookie的规则
*) 格式化给定主机的Cookie头部信息,原始端口和路径
httpclient附带一些cookieSpec的实现
网景公司草案:这个规范符合由网景通讯发布的原始草案规范。应当避免,除非有绝对的必要去兼容遗留代码。
RFC2109:官方HTTP状态管理规范并取代的老版本,被RFC 2965取代。
RFC2965:官方HTTP状态管理规范。
浏览器兼容性:这个实现努力去密切模仿(mis)通用Web浏览器应用程序的实现。比如微软的Internet Explorer和Mozilla的FireFox浏览器。
最佳匹配:'Meta'(元)cookie规范采用了一些基于又HTTP响应发送的cookie格式的cookie策略。它基本上聚合了以上所有的实现到以一个类中。 建议使用best match策略,让httpclient在运行时基于执行上下文采用一些合适的兼容等级

cookie规范注册表

httpclient使用CookieSpecRegistry类维护一个可用的cookie规范注册表。
兼容性:浏览器兼容性(宽松策略)。
网景:网景公司草案。
rfc2109:RFC 2109(过时的严格策略)。
rfc2965:RFC 2965(严格策略的标准符合)。
best-match:最佳匹配meta(元)策略。

选择cookie策略

cookie策略可以在http客户端被设置,如果需要,在http请求级重写.
HttpClient httpclient = new DefaultHttpClient();
//对每个默认的强制严格cookie策略
httpclient.getParams().setPatameter(ClientPNames.COOKIE_POLICY,CookiePolicy,RFC_2965);
HttpGet httpget=new HttpGet("http://www.broken-server.com/");
//对这个请求覆盖默认策略
httpget.getParams().setParameter(ClientPNames.COOKIE_POLICY,CookiePolicy.BROWSER_COMPABILITY);

定制cookie策略

实现定制(自定义)cookie策略,我们应该创建CookieSpec接口的定制实现类
创建一个CookieSpecFactory实现来创建和初始化定制实现的实例并使用HttpClient注册这个工厂

CookieSpecFactory csf = new CookieSpecFactory(){
 public CookieSpec newInstance(HttpParams params){
   return new BrowserCompatSpec(){
      @Override
      public void validate(Cookie cookie,CookieOrigin origin) throws MalformedCookieException{
        //......
      }
    };
}
};
DefaultHttpClient httpclient = new DefaultHttpClient();
httpclient.getCookieSpecs().reginster("easy",csf);
httpclient.getParams().setParameter(ClientPNames.COOKIE_POLICY,"easy");

cookie持久化

DefaultHttpClient httpClient = new DefaultHttpClient();
//创建一个本地cookie store实例
CookieStore cookieStore = new BasicCookieStore();
//如果需要填充cookie
BasicClientCookie cookie = new BasicClientCookie("name","value");
cookie.setVersion(0);
cookie.setDomain("127.0.0.1");
cookie.setPath("/");
cookieStore.addCookie(cookie);
//设置存储
httpclient.setCookieStore(cookieStore);
http状态管理和执行上下文
在http请求执行的过程中,httpclient添加了下列和状态管理相关的对象到执行上下文中
'http.cookiespec-registry':CookieSpecRegistry实例代表了实际的cookie规范注册表。这个属性的值设置在本地内容中,优先于默认的。
'http.cookie-spec':CookieSpec实例代表真实的cookie规范。
'http.cookie-origin':CookieOrigin实例代表了真实的源服务器的详细信息。
'http.cookie-store':CookieStore实例代表了真实的cookie存储。设置在本地内容中的这个属性的值优先于默认的。
本地的HttpContext对象可以被用来定制http状态管理内容,先于请求执行或者请求执行之后检查他的状态
HttpClient httpclient = new DefaultHttpClient();
HttpContext localContext = new BasicHttpContext();
HttpGet httpget = new HttpGet("http://localhost:8080/");
HttpResponse response = httpclient.execute(httpget, localContext);

CookieOrigin cookieOrigin = (CookieOrigin) localContext.getAttribute(ClientContext.COOKIE_ORIGIN);
System.out.println("Cookie origin: " + cookieOrigin);
CookieSpec cookieSpec = (CookieSpec) localContext.getAttribute(ClientContext.COOKIE_SPEC);
System.out.println("Cookie spec used: " + cookieSpec); 每个用户/线程的状态管理
HttpClient httpclient = new DefaultHttpClient();
//创建cookie store的本地实例
CookieStore cookieStore = new BasicCookieStore();
//创建本地的http内容
HttpContext content = new BasicHttpContext();
//绑定定制cookie store到本地内容中
content.setAttribute(ClientContext.COOKIE_STORE,cookieStore);
HttpGet httpget = new HttpGet("http://www.baidu.com");
//作为参数传递本地内容
HttpResponse response = httpclient.execute(httpget,content);

httpclient cookie相关介绍的更多相关文章

  1. Android HttpClient HttpURLConnection相关介绍

    Android HttpClient HttpURLConnection相关介绍 遇到一个问题 在android studio上用HttpClient编写网络访问代码的时候,发现该类无法导入并使用.. ...

  2. httpclient cookie使用介绍

    COOKIE的处理 session的保持是通过cookie来维持的,所以如果用户有勾选X天免登陆,这个session就X天内一直有效,就是通过这个cookie来维持. 如果没有选中x天免登陆,基本上就 ...

  3. 2.19 cookie相关操作

    2.19 cookie相关操作 前言虽然cookie相关操作在平常ui自动化中用得少,偶尔也会用到,比如登录有图形验证码,可以通过绕过验证码方式,添加cookie方法登录.登录后换账号登录时候,也可作 ...

  4. ppDelegate的相关介绍

    //  AppDelegate的相关介绍//  IOS笔记 //@interface AppDelegate : UIResponder <UIApplicationDelegate>// ...

  5. 【个人笔记】002-PHP基础-01-PHP快速入门-02-PHP语言相关介绍输

    002-PHP基础-01-PHP快速入门 02-PHP语言相关介绍 1.PHP是什么 Hypertext Preprocessor超文本预处理器 是一种通用开源脚本语言 Personal Home P ...

  6. android6.0SDK 删除HttpClient的相关类的解决方法

    本文转载自博客:http://blog.csdn.net/yangqingqo/article/details/48214865 android6.0SDK中删除HttpClient的相关类的解决方法 ...

  7. JMeter 配置元件之HTTP Cookie Manager 介绍

    配置元件之HTTP Cookie Manager 介绍   by:授客 QQ:1033553122 测试环境 apache-jmeter-2.13 1.   Cookie管理器介绍 Cookie Ma ...

  8. Android开发工程师文集-Activity生命周期,启动方式,Intent相关介绍,Activity详细讲解

    前言 大家好,给大家带来Android开发工程师文集-Activity生命周期,启动方式,Intent相关介绍,Activity详细讲解的概述,希望你们喜欢 Activity是什么 作为一个Activ ...

  9. CSS3 Backgrounds相关介绍

    CSS3 Backgrounds相关介绍 1.背景图片(background images)是在padding-box的左上角落脚安家的,我们可以使用background-position属性改变默认 ...

随机推荐

  1. 20144303石宇森《网络对抗》注入shellcode和Return-to-libc攻击

    20144303石宇森<网络对抗>PC平台逆向破解 实验1:shellcode注入 实验基础 1.Linux下有两种基本构造攻击buf的方法:retaddr+nop+shellcode,n ...

  2. 自定义LisetView

    1.ListView listview=findViewById(R.id.listview); 2.public class MyAdapter extends BaseAdapter{ priva ...

  3. 从bios启动说起

    如果从bios启动说起的话,BIOS去加载bootloader,bootloader去加载操作系统,那么bootloader是怎么找到操作系统的呢?经过一些流程后,它会去找grub:然后通过grub提 ...

  4. PMBOK十大知识领域是什么?

    PMBOK十大知识领域是:整合管理.范围管理.时间管理.成本管理.质量管理.人力资源管理.沟通管理.风险管理.采购管理.干系人管理. 各用一句话概括项目管理知识体系十大知识领域: 1.整合管理:其作用 ...

  5. JavaScript:Object属性方法

    Object的属性(firebug中没有找到) var pro={ city:"shanghai", list:[,,,,] } var Person=function(name, ...

  6. 如何加速tomcat启动速度

    在tomcat启动的时候,我们可以做一些优化设置来使得tomcat的启动更快速,下面是一些常见的优化加速启动的方法建议(以tomcat-7.+为例说明). 1.  Jars包 1.1.将一些不必要的j ...

  7. 04_Flume多节点load_balance实践

    1.负载均衡场景 1)初始:上游Agent通过round_robin selector, 将event轮流发送给下游Collecotor1, Collector2 2)故障: 关闭Collector1 ...

  8. 【BZOJ】 3238: [Ahoi2013]差异

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3238 求:$${\sum _{i=1}^{n-1}\sum _{j=i+1}^{n}len ...

  9. C# 集合-并发处理-锁OR线程 (转载)

    每次写博客,第一句话都是这样的:程序员很苦逼,除了会写程序,还得会写博客!当然,希望将来的一天,某位老板看到此博客,给你的程序员职工加点薪资吧!因为程序员的世界除了苦逼就是沉默.我眼中的程序员大多都不 ...

  10. shell 布尔运算

    布尔运算 Bash 里的逻辑运算,与.或.非. 在 Shell 下如何进行逻辑运算 范例:true or false 单独测试 true 和 false,可以看出 true 是真值,false 为假 ...