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. 面向对象第一话,大战java正则表达式

    本周我们迎来第一项任务,java面向对象之实现对一串字符的匹配以及构造出计算的多项式,最终得出计算的结果.简而言之,可以用以下的要求来看题目: 输入的多项式字符串中不得出现非法字符 多项式的输入型式, ...

  2. C# 获取枚举的描述属性

    在使用枚举类型时,我们需要取名称和值,甚至有时候还需要取枚举类型的描述.通过反射,我们能获取到枚举类型的描述属性. 首先我们需要给枚举类型添加描述属性(属性都没有是不可能取到的),[Descripti ...

  3. MongoDB树形结构表示法

    http://docs.mongodb.org/manual/tutorial/model-tree-structures/ MongoDB五种树形结构表示法 第一种:父链接结构 db.categor ...

  4. POJ 3162 Walking Race(树形dp+单调队列 or 线段树)

    http://poj.org/problem?id=3162 题意:一棵n个节点的树.有一个屌丝爱跑步,跑n天,第i天从第i个节点开始跑步,每次跑到距第i个节点最远的那个节点(产生了n个距离),现在要 ...

  5. Cocos2d-x学习笔记(二)AppDelegate类详解

    由源代码,可得到如下的类继承关系: 1. 在方法applicationDidFinishLaunching中,首先会调用CCDirector* pDirector = CCDirector::shar ...

  6. python 线性查找

    import random val= data=[,,,,] : find= val=int(input('请输入查找键值(1-9),输入-1离开:')) for i in data: if i==v ...

  7. python 斐波那契查找

    def fibonacci_search(lis, key): # F = [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987 ...

  8. Seafile 文件访问日志时间不一致问题

    修改/seafile-server-latest/seahub/seahub/setting.py # Local time zone for this installation. Choices c ...

  9. jsp session/application

    session的增加读取 session.setAttribute("username", "张三"); String u = (String) session ...

  10. 雷林鹏分享:C# 泛型(Generic)

    C# 泛型(Generic) 泛型(Generic) 允许您延迟编写类或方法中的编程元素的数据类型的规范,直到实际在程序中使用它的时候.换句话说,泛型允许您编写一个可以与任何数据类型一起工作的类或方法 ...