1 Cookie 是什么
Cookie
Cookie,有时也用其复数形式 Cookies,指某些网站为了辨别用户身份、进行 session 跟踪而储存在用户本地终端上的数据(通常经过加密)。360 百科 Cookie
插曲 Session
Session
由于 HTTP 协议是无状态的协议,所以当服务端需要记录用户状态时,就需要用某种机制来识别具体的用户,这个机制就是 Session。
2 Cookie 有什么用
笔者以简书显示内容为繁体还是简体为例,来介绍 Cookie 的用处:
(1)当我们使用浏览器访问 jianshu.com 时,简书服务端不知道浏览器的信息,默认情况下,浏览器显示内容为“简体”;
(2)当我们设置浏览器显示内容为“繁体”时,浏览器将显示繁体内容;
(3)当我们关闭浏览器,再重新打开浏览器,发现简书的显示内容仍然会是繁体;笔者认为原因是简书服务端可能给浏览器做了一个唯一标识的记录,放置到自己的 Session 中,当浏览器重启后,再去服务端请求简书内容,发现当前浏览器需要显示为繁体,便下发了繁体显示内容;
(4)如果没有使用 Cookie,因为 HTTP 协议是无状态的,那么我们设置的显示内容为繁体或者简体后,当我们打开新的页面或关闭浏览器重新打开的时候,之前设置的显示繁体或者简体便不存在了。
3 Cookie 的类型
摘自 HTTP 权威指南
笼统地说,Cookie 分为 2 类:会话 Cookie 和 持久 Cookie
会话 Cookie 是一种临时 Cookie,它记录用户访问长点是的设置和偏好。用户退出浏览器时,会话 Cookie 就被删除了。
持久 Cookie 的生存时间更长一些,他们存储在硬盘上,浏览器退出,计算机重启时,他们仍然存在。通常用持久 Cookie 维护某个用户会周期性访问的站点的配置文件或登录名。
会话 Cookie 和持久 Cookie 之间的唯一区别就是他们的过期时间。没有指定 Expires(过期时间)时,默认为会话 Cookie。
以简书为例:看下简书的会话 Cookie 和持久 Cookie:
上图表明:jianshu.com 的 cookies
持久 Cookie:
expires 过期时间为 2018 年 4 月 9 日星期二 Tue,09 Apr 2019 13:31:57 -0000
笔者猜测这个值表示的意思是当前的某个时间减去 0000,以达到作为持久 Cookie 的目的
domain 为.jianshu.com
Path 为 /
Secure 为 YES
Http only 为 true;
会话 Cookie:
local:zh-CN 显示为简体;
包括会话 Cookie,笔者以为关闭浏览器后会话 Cookie 就会消失,不过笔者的如下测试结果,不确定算不算是会话 Cookie 消失的一种体现。首次启动浏览器显示的会话 Cookie 为:
设置过繁体的情况:
然后刷新 jianshu.com,显示内容,就只会显示
或是
不确定这个算不算是会话 Cookie 在关闭浏览器后,就消失了。读者也可以自己测试一下。有做服务端的同学知道的话,敬请告知。
4 Cookie 的工作流程
笔者仍以浏览器打开简书显示内容字体为“简体”或是“繁体”为例阐述 Cookie 的工作流程。
(1)当我们使用浏览器首次访问 jianshu.com 时,简书服务端不知道浏览器的信息,默认情况下,浏览器显示内容为“简体”。服务端对浏览器创建一个 Session;
(2)当我们设置浏览器显示内容为“繁体”时,会通过 Cookie 的方式设置 local 为 zh-TW,给服务端发送请求,并且得到的响应会是设置浏览器的显示内容为“繁体”,服务端同事会更新 Session 中的信息为 zh-TW(繁体);
(3)当我们关闭浏览器,会话消失的情况下,然后我们再重新打开浏览器,发现简书的显示内容仍然会是繁体,笔者认为这个是因为简书服务端 Session 存储着浏览器应该显示字体,(比如服务端存储着浏览器的某个唯一的 id,然后当重新打开浏览器,对服务端做请求时,服务端根据之前的 Session 下发繁体内容)。
5 Cookie 的属性
Domain(域):Cookie 的域;浏览器只向指定域中的服务器主机名发送 Cookie,这样服务器就将 Cookie 限制在了特定的域中。jianshu.com 域就与 jianshu1.jianshu.com 和 jianshu1.jianshu2.jianshu.com 相匹配,但与 js.com 就不匹配了。
Path(路径):通过这个属性可以为服务器上特定的文档分配 Cookie,如果 Path 属性是一个 URL 路径前缀,就可以附加一个 Cookie,路径/foo,与/foobar 和 foo/bar.html 相匹配,路径"/"与域名中所有的内容都匹配。
Secure(安全):是否只有在 HTTP 使用 SSL 连接时才发送这个 Cookie;
expires(过期):从格林尼治标准时间 1970 年 1 月 1 日 00:00:00 开始的过期秒数;
name(名字):Cookie 变量的名字;
value(值):Cookie 变量的值;
6 iOS 中 NSHTTPCookie
常用属性:
NSHTTPCookieDomain domain:cookie 的域;
NSHTTPCookiePath path:Cookie 的 path;
NSHTTPCookiePort portList:Cookie 的端口列表;
NSHTTPCookieName name:Cookie 的名字;
NSHTTPCookieValue value:Cookie 的值;
NSHTTPCookieVersion version: Cookie 的版本;
NSHTTPCookieExpires expireDate:Cookie 的过期时间;
NSHTTPCookieDiscard sessionOnly:一个布尔值,表示 cookie 是否应该在会话结束的时候被丢弃(不管过期日期);
HTTPOnly:指定客户端不要与 JavaScript 应用共享 Cookie,以防止跨站脚本攻击;
NSHTTPCookieSecure secure:指定 Cookie 只会用在 HTTPS 连接而非 HTTP 连接;
properties:Cookie 的属性;
NSHTTPCookiePropertyKey:定义 cookie 属性字典中支持的常量;
NSHTTPCookieComment comment:Cookie 的说明文字
NSHTTPCookieCommentURL commentURL:cookie 的说明 URL;
NSHTTPCookieAcceptPolicy:Cookie 的访问权限,NSHTTPCookie 由 NSHTTPCookieStorage 管理。
NSHTTPCookieAcceptPolicyAlways:存储所有的 cookie;
NSHTTPCookieAcceptPolicyNever:不会存储 cookie;
NSHTTPCookieAcceptPolicyOnlyFromMainDocumentDomain:只保存域值和请求域相匹配的 Cookie;
7 iOS 网络请求使用 Cookie
客户端的请求头里边的 cookie 的 header,key 为"cookie"
服务端响应客户端的时候,响应头中的 cookie 的 header,key 为"set-cookie"
网络请求使用 AFN 携带 Cookie 测试 AFN 网络请求携带 Cookie,笔者使用的是访问 juejin.im 的时候携带 Cookie,效果如下图:
相关代码如下:
当需要设置多个 cookie 值的时候,使用 cookieKey1=cookieValue1 ;cookieKey2=cookieValue2;的方式,使用分号分隔开每一对 cookieKey 及 Value。
网络请求使用 NSURLSession 携带 Cookie
测试 NSURLSession 网络请求携带 Cookie,笔者使用的是访问 jianshu.com 的时候携带 Cookie,效果如下图:
相关代码如下:
本文转载自公众号 360 云计算(ID:hulktalk)。
原文链接:
https://mp.weixin.qq.com/s/Mrof5K0OA7oHh9h3cRk85A
评论