httpclient cookie相关介绍
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相关介绍的更多相关文章
- Android HttpClient HttpURLConnection相关介绍
Android HttpClient HttpURLConnection相关介绍 遇到一个问题 在android studio上用HttpClient编写网络访问代码的时候,发现该类无法导入并使用.. ...
- httpclient cookie使用介绍
COOKIE的处理 session的保持是通过cookie来维持的,所以如果用户有勾选X天免登陆,这个session就X天内一直有效,就是通过这个cookie来维持. 如果没有选中x天免登陆,基本上就 ...
- 2.19 cookie相关操作
2.19 cookie相关操作 前言虽然cookie相关操作在平常ui自动化中用得少,偶尔也会用到,比如登录有图形验证码,可以通过绕过验证码方式,添加cookie方法登录.登录后换账号登录时候,也可作 ...
- ppDelegate的相关介绍
// AppDelegate的相关介绍// IOS笔记 //@interface AppDelegate : UIResponder <UIApplicationDelegate>// ...
- 【个人笔记】002-PHP基础-01-PHP快速入门-02-PHP语言相关介绍输
002-PHP基础-01-PHP快速入门 02-PHP语言相关介绍 1.PHP是什么 Hypertext Preprocessor超文本预处理器 是一种通用开源脚本语言 Personal Home P ...
- android6.0SDK 删除HttpClient的相关类的解决方法
本文转载自博客:http://blog.csdn.net/yangqingqo/article/details/48214865 android6.0SDK中删除HttpClient的相关类的解决方法 ...
- JMeter 配置元件之HTTP Cookie Manager 介绍
配置元件之HTTP Cookie Manager 介绍 by:授客 QQ:1033553122 测试环境 apache-jmeter-2.13 1. Cookie管理器介绍 Cookie Ma ...
- Android开发工程师文集-Activity生命周期,启动方式,Intent相关介绍,Activity详细讲解
前言 大家好,给大家带来Android开发工程师文集-Activity生命周期,启动方式,Intent相关介绍,Activity详细讲解的概述,希望你们喜欢 Activity是什么 作为一个Activ ...
- CSS3 Backgrounds相关介绍
CSS3 Backgrounds相关介绍 1.背景图片(background images)是在padding-box的左上角落脚安家的,我们可以使用background-position属性改变默认 ...
随机推荐
- 奇怪的问题:改变了界面,生成的exe不起作用
现象:修改ui界面的控件,如改变text,生成exe没有改变,清理.重新创建也没有作用 原因:ui.h没有被更新,每次软件生成的时候都是调用的旧的文件 解决:先将debug和release文件夹删除, ...
- 【LTE基础知识】SGLTE, SVLTE, CSFB, VoLTE【转】
本文转载自:https://blog.csdn.net/henryghx/article/details/18416405 4G网络下实现语音通话功能的技术共有三种——VoLTE.SGLTE(GSM ...
- linux下kermit工具的使用
1.环境: ubuntu16.04 2.背景: 想更换下位机内核 3.使用kermit进行串口传输 举例:传输文件到下位机 2.1首先进入下位机的uboot 2.2 使用uboot自带的命令从串口接收 ...
- 再谈vim中多窗口的编辑 ctrl+w+H窗口位置最大化和互换等操作
参考:http://blog.csdn.net/shuangde800/article/details/11430659 很好 鼠标在各个窗口间循环移动: ctrl+w+(小写的 hjkl), &qu ...
- 获取转UTF8的字符串
/// <summary> /// 获取转UTF8的字符串 /// </summary> /// <param name="strWord">& ...
- React Native 的组件之底部导航栏 TabBarIOS(一)
import React,{Component}from 'react'; import { AppRegistry, StyleSheet, Text, View, TabBarIOS, } fro ...
- pycharm Django
上面的两张图片,是Django项目出错的图片,记得以前也出现过这个情况,当时好像是关闭了一些端口程序,后来就可以了,但是忘记了,那个链接也找不到了,所以现在很困惑,再找找. 电脑上现在程序安装的太多, ...
- 30分钟了解Shiro与Springboot的多Realm基础配置
写在前面的话: 我之前写过两篇与shiro安全框架有关的博文,居然能够广受欢迎实在令人意外.说明大家在互联网时代大伙对于安全和登录都非常重视,无论是大型项目还是中小型业务,普遍都至少需要登录与认证的逻 ...
- 雷林鹏分享:Ruby 块
Ruby 块 您已经知道 Ruby 如何定义方法以及您如何调用方法.类似地,Ruby 有一个块的概念. 块由大量的代码组成. 您需要给块取个名称. 块中的代码总是包含在大括号 {} 内. 块总是从与其 ...
- [.NET开发] NPOI导出
//导出全部 expertPara = GetExpetPara(); expertPara.BeginIndex = pager.CurrentPageIndex; expertPara.EndIn ...