Cookie是什么?从哪来?存在哪?往哪去?
什么是cookie?
cookie最简单的介绍就是服务器返回的一个字符串信息,只不过我们每次请求都需要把它发送给服务器。以AFN和android-async-http为例子,默认都会把cookie自动保存并且下次发送请求的时候将cookie提交给服务器。
什么时候会提交cookie到服务器?
这个问题需要知道cookie的作用域,cookie有效的作用域为当前文件目录以及子目录。例如:
http://www.xxx.com/love
//如果此请求返回了cookie,并且path是/love
那么在程序的生命期间,通过AFN和android-async-http访问所有的/love
目录以及/love/xxx
的子目录的时候,框架会自动将cookie提交到服务器。
如果发起的请求不是/love
目录本身或者其子目录,那么框架就不会将cookie提交到服务器。如果这个时候需要我们访问http://www.xxx.com/person
接口的时候也带上之前返回的cookie,该怎么办?
返回的cookie存在哪里?
最简单的办法就是自己做cookie的存储和发送,服务器返回的cookie会存储在response 的Header里面,例如:
HTTP response Header:
{
"Content-Type" = "text/html;charset=UTF-8";
Date = "Thu, 29 Jun 2017 08:50:18 GMT";
Server = "Apache-Coyote/1.1";
"Set-Cookie" = "token=a27c5779-3718-4716-bbfa-6a51407c6d70";
"Transfer-Encoding" = Identity;
}
其中"Set-Cookie"是response的Header中默认用来存储cookie的字段(当然你可以另外起其它名字,但是通用的规范还是这个字符串)
提交给服务器的cookie存在哪里?
和response的Header一样,request的Header中也有一个字段用来存储cookie字符串,这个字段默认是cookie
,例如:
HTTP request Header:
{
Cookie = token=c66fbbc7-d799-426e-b065-d23226833dda;
Content-Type = application/x-www-form-urlencoded; charset=utf-8;
Device-OS = 10.3;
version = 1.0.57;
User-Agent = XProduct/1.0.57 (iPhone; iOS 10.3; Scale/2.00);
Device-Name = x86_64;
Accept-Language = zh-Hans-US;q=1, en;q=0.9;
}
具体怎么做?
现在知道了cookie是什么,从哪来,往哪去,那么事情就简单了,所以问题的最后变成了:如何获取response Header中的键值对以及如何设置request Header?
当然,不管是iOS还是Android都有提供相应的HTTPCookie框架,其次其本质无非就是从response Header中的"Set-Cookie"获取字符串,然后将指定的cookie存储在requset的Header中,例如:
//获取cookie
NSHTTPURLResponse *res = (NSHTTPURLResponse *)response;
//fields的输出结果就是上面的response header的内容
NSDictionary *fields = [res allHeaderFields];
NSLog(@"fields = %@", [fields description]);
NSArray<NSHTTPCookie *> *cookie = [NSHTTPCookie cookiesWithResponseHeaderFields:fields forURL:request.URL]
上面NSHTTPCookie
的类方法其实就是将上面的respnse Header中的cookie字符串拆分成为一对象,比如下面就是拆分结果:
<NSHTTPCookie version:0 name:"token" value:"a27c5779-3718-4716-bbfa-6a51407c6d70"
expiresDate:(null) created:2017-06-29 08:50:21 +0000 sessionOnly:TRUE domain:"102.211.179.114"
partition:"none" path:"/XProduct" isSecure:FALSE>
我们完全可以不需要使用NSHTTPCookie,无非就是从response Header中获得Set-Cookie
字段对应的字符串罢了。
至于将cookie设置到request Header中的框架API,我就没有去细看,因为我直接手动设置:
httpRequestSerializer = [AFHTTPRequestSerializer serializer];
//token是一个字符串,是response header中'Set-Cookie'对应的字符串
[httpRequestSerializer setValue:token forHTTPHeaderField:@"cookie"]
至于怎么使用API去做cookie,这个搜索一下还是挺多介绍的,本文主要介绍的是cookie从哪来,存在哪,往哪去。
Cookie是什么?从哪来?存在哪?往哪去?的更多相关文章
- [JavaEE笔记]Cookie
引言 由于 Http 是一种无状态的协议,服务器单从网络连接上无从知道客户身份. 会话跟踪是 Web 程序中常用的技术,用来跟踪用户的整个会话.常用会话跟踪技术是 Cookie 与 Session. ...
- Cookie/Session机制详解
会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话.常用的会话跟踪技术是Cookie与Session.Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端 ...
- cookie相关
参考百度百科: Cookie,有时也用其复数形式Cookies,指某些网站为了辨别用户身份.进行session跟踪而储存在用户本地终端上的数据(通常经过加密).定义于RFC2109和2965都已废弃, ...
- 【转】Cookie和Session区别和联系详解
会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话.常用的会话跟踪技术是Cookie与Session.Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端 ...
- 理解Cookie和Session机制(转)
目录[-] Cookie机制 什么是Cookie 记录用户访问次数 Cookie的不可跨域名性 Unicode编码:保存中文 BASE64编码:保存二进制图片 设置Cookie的所有属性 Cookie ...
- session,ajax 跨域cookie
什么是Session, 什么是Cookie? Session是由应用服务器维持的一个服务器端的存储空间,用户在连接服务器时,会由服务器生成一个唯一的SessionID,用该SessionID为标识符来 ...
- [转]Cookie/Session机制详解
原文地址:http://blog.csdn.net/fangaoxin/article/details/6952954 会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话.常用 ...
- 浏览器中跨域创建cookie的问题
当我们在www.a.com这个域下用ajax提交一个请求到www.b.com这个域的时候,默认情况下,浏览器是不允许的,因为违反了浏览器的同源策略.解决方案可以参考笔者的这篇博文:http://www ...
- 关于cookie的文章(cookie与session机制)
会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话.常用的会话跟踪技术是Cookie与Session.Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端 ...
- cookie注入的形成,原理,利用总结
一:cookie注入的形成 程序对提交数据获取方式是直接request("c.s.t")的方式.未指明使用request对象的具体方法进行获取. 二:原理 request(&quo ...
随机推荐
- Python开发【模块】:CSV文件 数据可视化
CSV模块 1.CSV文件格式 要在文本文件中存储数据,最简单的方式是讲数据作为一系列逗号分隔的值(CSV)写入文件,这样的文件成为CSV文件,如下: AKDT,Max TemperatureF,Me ...
- Kubernetes实战(二):k8s v1.11.1 prometheus traefik组件安装及集群测试
1.traefik traefik:HTTP层路由,官网:http://traefik.cn/,文档:https://docs.traefik.io/user-guide/kubernetes/ 功能 ...
- js基础面试高频面点1:变量提升
一.什么是变量提升?var变量提升的底层原理是什么? 变量提升的定义:所有变量的声明语句都会被提升到代码头部,这就是变量提升. 原理:引擎在读取js代码的过程中,分为两步,专业来说代码运行是分为预处理 ...
- Day06 DOM4J&schema介绍&xPath
day06总结 今日内容 XML解析之JAXP( SAX ) DOM4J Schema 三.XML解析器介绍 操作XML文档概述 1 如何操作XML文档 XML文档也是数据的一种,对数据的 ...
- mysql 约束条件介绍
mysql 约束条件介绍 约束条件与数据类型的宽度一样,都是可选参数 作用:用于保证数据的完整性和一致性主要分为: PRIMARY KEY (PK) 标识该字段为该表的主键,可以唯一的标识记录 FO ...
- 数据库触发器,禁止DDL操作
CREATE TRIGGER [Object_Change_Trigger_DDL] ON DATABASE FOR ALTER_TABLE,DROP_TABLE,CREATE_TABLE,CREAT ...
- java-mybaits-010-mybatis-spring-使用 SqlSession、注入映射器
一. SqlSession概述 在 MyBatis 中,你可以使用 SqlSessionFactory 来创建 SqlSession.一旦你获得一个 session 之后,你可以使用它来执行映射语句, ...
- [随感]GIS开发的困惑
从事GIS应用开发也有3年了,但是做了些东西自己始终不满意,不是不稳定就是效率低,不是功能杂就是不实用! 首先是AE开发,我必须说自己很欣赏ArcGIS的软件设计架构和思想.但是在开发的过程中也确实遇 ...
- log4j2介绍及配置
一.log4j2概述 在日常的开发,测试和生产环境中,日志记录了应用,服务运行过程中的关键信息,以及出现异常时的堆栈,这些信息常常作为查询,定位,解决问题的关键,因此在任何系统中,对日志的使用得当,将 ...
- 7.2 Models -- Defining Models
一.概述 1. 模型是一个类,它定义了你呈现给用户的数据的属性和行为.用户希望如果他们离开你的应用程序,并返回后(或如果他们刷新页面)看到的任何东西应该被一个model代表. 2. 确保在ember. ...