Cookie简介

级别: ★☆☆☆☆
标签:「iOS 」「Cookie简介」「AFN Cookie」「NSURLSession Cookie」
作者: WYW
审校: QiShare团队


前言 笔者最近看了部分关于Cookie的内容,写了如下文字,给大家分享下。

Cookie是什么

  • Cookie

Cookie,有时也用其复数形式Cookies,指某些网站为了辨别用户身份、进行session跟踪而储存在用户本地终端上的数据(通常经过加密)。360百科 Cookie

插曲Session

  • Session

由于HTTP协议是无状态的协议,所以当服务端需要记录用户状态时,就需要用某种机制来识别具体的用户,这个机制就是Session。

Cookie有什么用

笔者以简书显示内容为繁体还是简体为例,来介绍Cookie的用处:

(1)当我们使用浏览器访问jianshu.com时,简书服务端不知道浏览器的信息,默认情况下,浏览器显示内容为“简体”;

(2)当我们设置浏览器显示内容为“繁体”时,浏览器将显示繁体内容;

(3)当我们关闭浏览器,再重新打开浏览器,发现简书的显示内容仍然会是繁体;笔者认为原因是简书服务端可能给浏览器做了一个唯一标识的记录,放置到自己的Session中,当浏览器重启后,再去服务端请求简书内容,发现当前浏览器需要显示为繁体,便下发了繁体显示内容。

(4)如果没有使用Cookie,因为HTTP协议是无状态的,那么我们设置的显示内容为繁体或者简体后,当我们打开新的页面或关闭浏览器重新打开的时候,之前设置的显示繁体或者简体便不存在了。

Cookie的类型

摘自HTTP权威指南

笼统地说,Cookie分为2类: 会话Cookie持久Cookie

会话Cookie是一种临时Cookie,它记录用户访问长点是的设置和偏好。用户退出浏览器时,会话Cookie就被删除了。

持久Cookie的生存时间更长一些,他们存储在硬盘上,浏览器退出,计算机重启时,他们仍然存在。通常用持久Cookie维护某个用户会周期性访问的站点的配置文件或登录名。

会话Cookie和持久Cookie之间的唯一区别就是他们的过期时间。
没有指定Expires(过期时间)时,默认为会话Cookie。

以简书为例:
看下简书的会话Cookie和持久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为:

local:zh-CN;

path:/;

default_font:font1;

设置过繁体的情况:

local:zh-TW;

path:/;

default_font:font1;

然后刷新jianshu.com,显示内容,就只会显示

local:zh-CN

或是

local:zh-TW

不确定这个算不算是会话Cookie在关闭浏览器后,就消失了。读者也可以自己测试一下。有做服务端的同学知道的话,敬请告知。

Cookie的工作流程

笔者仍以浏览器打开简书显示内容字体为“简体”或是“繁体”为例阐述Cookie的工作流程。

(1)当我们使用浏览器首次访问jianshu.com时,简书服务端不知道浏览器的信息,默认情况下,浏览器显示内容为“简体”。服务端对浏览器创建一个Session;

(2)当我们设置浏览器显示内容为“繁体”时,会通过Cookie的方式设置local为zh-TW,给服务端发送请求,并且得到的响应会是设置浏览器的显示内容为“繁体”,服务端同事会更新Session中的信息为zh-TW(繁体);

(3)当我们关闭浏览器,会话消失的情况下,然后我们再重新打开浏览器,发现简书的显示内容仍然会是繁体,笔者认为这个是因为简书服务端Session存储着浏览器应该显示字体,(比如服务端存储着浏览器的某个唯一的id,然后当重新打开浏览器,对服务端做请求时,服务端根据之前的Session下发繁体内容)。

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变量的值;

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;

iOS 网络请求使用Cookie

客户端的请求头里边的cookie的header,key为"cookie"

服务端响应客户端的时候,响应头中的cookie的header,key为"set-cookie"

  • 网络请求使用AFN携带Cookie
    测试AFN网络请求携带Cookie,笔者使用的是访问juejin.im的时候携带Cookie,效果如下图:
    AFNJuejinCookie.png

相关代码如下:

    NSString *urlString = @"https://juejin.im";
    AFHTTPSessionManager *sessionManager = [AFHTTPSessionManager manager];
    sessionManager.responseSerializer = [AFHTTPResponseSerializer serializer];
    [sessionManager.requestSerializer setValue:@"QiShareNameAFN=QiShareValueAFN;QiShareTokenAFN=QiShareTokenValueAFN" forHTTPHeaderField:@"cookie"];
    [sessionManager GET:urlString parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
    }];

当需要设置多个cookie值的时候,使用cookieKey1=cookieValue1;cookieKey2=cookieValue2;的方式,使用分号分隔开每一对cookieKey及Value。

  • 网络请求使用NSURLSession携带Cookie

测试NSURLSession网络请求携带Cookie,笔者使用的是访问jianshu.com的时候携带Cookie,效果如下图:


NSURLSessionJianshuCookie.png

相关代码如下:

    NSURL *url = [NSURL URLWithString:@"https://www.jianshu.com"];
    NSMutableURLRequest *mRequest = [NSMutableURLRequest requestWithURL:url];
    mRequest.HTTPMethod = @"GET";
    [mRequest setValue:@"QiShareName=QiShareValue;QiShareToken=QiShareTokenValue" forHTTPHeaderField:@"cookie"];
    NSURLSession *session = [NSURLSession sharedSession];
    NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:mRequest completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
    }];
    [dataTask resume];

Demo:

更多相关内容,可查看 QiNetwork

参考学习网址


推荐文章:
iOS 图标&启动图生成器(一)
算法小专栏:“D&C思想”与“快速排序”
iOS 避免常见崩溃(二)
算法小专栏:选择排序
iOS Runloop(一)
iOS 常用调试方法:LLDB命令
iOS 常用调试方法:断点
iOS 常用调试方法:静态分析

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,014评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,796评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,484评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,830评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,946评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,114评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,182评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,927评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,369评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,678评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,832评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,533评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,166评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,885评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,128评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,659评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,738评论 2 351