Cookie簡(jiǎn)介

級(jí)別: ★☆☆☆☆
標(biāo)簽:「iOS 」「Cookie簡(jiǎn)介」「AFN Cookie」「NSURLSession Cookie」
作者: WYW
審校: QiShare團(tuán)隊(duì)


前言 筆者最近看了部分關(guān)于Cookie的內(nèi)容,寫了如下文字腰耙,給大家分享下疟暖。

Cookie是什么

  • Cookie

Cookie,有時(shí)也用其復(fù)數(shù)形式Cookies末捣,指某些網(wǎng)站為了辨別用戶身份咐熙、進(jìn)行session跟蹤而儲(chǔ)存在用戶本地終端上的數(shù)據(jù)(通常經(jīng)過(guò)加密)枕稀。360百科 Cookie

插曲Session

  • Session

由于HTTP協(xié)議是無(wú)狀態(tài)的協(xié)議捐名,所以當(dāng)服務(wù)端需要記錄用戶狀態(tài)時(shí),就需要用某種機(jī)制來(lái)識(shí)別具體的用戶闹击,這個(gè)機(jī)制就是Session镶蹋。

Cookie有什么用

筆者以簡(jiǎn)書顯示內(nèi)容為繁體還是簡(jiǎn)體為例,來(lái)介紹Cookie的用處:

(1)當(dāng)我們使用瀏覽器訪問jianshu.com時(shí)赏半,簡(jiǎn)書服務(wù)端不知道瀏覽器的信息贺归,默認(rèn)情況下,瀏覽器顯示內(nèi)容為“簡(jiǎn)體”断箫;

(2)當(dāng)我們?cè)O(shè)置瀏覽器顯示內(nèi)容為“繁體”時(shí)拂酣,瀏覽器將顯示繁體內(nèi)容;

(3)當(dāng)我們關(guān)閉瀏覽器仲义,再重新打開瀏覽器婶熬,發(fā)現(xiàn)簡(jiǎn)書的顯示內(nèi)容仍然會(huì)是繁體;筆者認(rèn)為原因是簡(jiǎn)書服務(wù)端可能給瀏覽器做了一個(gè)唯一標(biāo)識(shí)的記錄埃撵,放置到自己的Session中赵颅,當(dāng)瀏覽器重啟后,再去服務(wù)端請(qǐng)求簡(jiǎn)書內(nèi)容暂刘,發(fā)現(xiàn)當(dāng)前瀏覽器需要顯示為繁體饺谬,便下發(fā)了繁體顯示內(nèi)容。

(4)如果沒有使用Cookie谣拣,因?yàn)镠TTP協(xié)議是無(wú)狀態(tài)的募寨,那么我們?cè)O(shè)置的顯示內(nèi)容為繁體或者簡(jiǎn)體后族展,當(dāng)我們打開新的頁(yè)面或關(guān)閉瀏覽器重新打開的時(shí)候,之前設(shè)置的顯示繁體或者簡(jiǎn)體便不存在了拔鹰。

Cookie的類型

摘自HTTP權(quán)威指南

籠統(tǒng)地說(shuō)仪缸,Cookie分為2類: 會(huì)話Cookie持久Cookie

會(huì)話Cookie是一種臨時(shí)Cookie,它記錄用戶訪問長(zhǎng)點(diǎn)是的設(shè)置和偏好格郁。用戶退出瀏覽器時(shí)腹殿,會(huì)話Cookie就被刪除了。

持久Cookie的生存時(shí)間更長(zhǎng)一些例书,他們存儲(chǔ)在硬盤上锣尉,瀏覽器退出,計(jì)算機(jī)重啟時(shí)决采,他們?nèi)匀淮嬖谧圆住MǔS贸志肅ookie維護(hù)某個(gè)用戶會(huì)周期性訪問的站點(diǎn)的配置文件或登錄名。

會(huì)話Cookie和持久Cookie之間的唯一區(qū)別就是他們的過(guò)期時(shí)間树瞭。
沒有指定Expires(過(guò)期時(shí)間)時(shí)拇厢,默認(rèn)為會(huì)話Cookie。

以簡(jiǎn)書為例:
看下簡(jiǎn)書的會(huì)話Cookie和持久Cookie:


持久Cookie 會(huì)話Cookie

上圖表明:
jianshu.com的cookies

持久Cookie:

  • expires 過(guò)期時(shí)間為2018年4月9日星期二 Tue,09 Apr 2019 13:31:57 -0000
    • 筆者猜測(cè)這個(gè)值表示的意思是當(dāng)前的某個(gè)時(shí)間減去0000晒喷,以達(dá)到作為持久Cookie的目的
  • domain 為.jianshu.com
  • Path 為 /
  • Secure為YES
  • Http only 為true孝偎;

會(huì)話Cookie:

  • local:zh-CN 顯示為簡(jiǎn)體;

包括會(huì)話Cookie凉敲,筆者以為關(guān)閉瀏覽器后會(huì)話Cookie就會(huì)消失衣盾,不過(guò)筆者的如下測(cè)試結(jié)果,不確定算不算是會(huì)話Cookie消失的一種體現(xiàn)爷抓。首次啟動(dòng)瀏覽器顯示的會(huì)話Cookie為:

local:zh-CN;

path:/;

default_font:font1;

設(shè)置過(guò)繁體的情況:

local:zh-TW;

path:/;

default_font:font1;

然后刷新jianshu.com势决,顯示內(nèi)容,就只會(huì)顯示

local:zh-CN

或是

local:zh-TW

不確定這個(gè)算不算是會(huì)話Cookie在關(guān)閉瀏覽器后蓝撇,就消失了果复。讀者也可以自己測(cè)試一下。有做服務(wù)端的同學(xué)知道的話渤昌,敬請(qǐng)告知虽抄。

Cookie的工作流程

筆者仍以瀏覽器打開簡(jiǎn)書顯示內(nèi)容字體為“簡(jiǎn)體”或是“繁體”為例闡述Cookie的工作流程。

(1)當(dāng)我們使用瀏覽器首次訪問jianshu.com時(shí)独柑,簡(jiǎn)書服務(wù)端不知道瀏覽器的信息极颓,默認(rèn)情況下,瀏覽器顯示內(nèi)容為“簡(jiǎn)體”群嗤。服務(wù)端對(duì)瀏覽器創(chuàng)建一個(gè)Session菠隆;

(2)當(dāng)我們?cè)O(shè)置瀏覽器顯示內(nèi)容為“繁體”時(shí),會(huì)通過(guò)Cookie的方式設(shè)置local為zh-TW,給服務(wù)端發(fā)送請(qǐng)求骇径,并且得到的響應(yīng)會(huì)是設(shè)置瀏覽器的顯示內(nèi)容為“繁體”躯肌,服務(wù)端同事會(huì)更新Session中的信息為zh-TW(繁體);

(3)當(dāng)我們關(guān)閉瀏覽器破衔,會(huì)話消失的情況下清女,然后我們?cè)僦匦麓蜷_瀏覽器,發(fā)現(xiàn)簡(jiǎn)書的顯示內(nèi)容仍然會(huì)是繁體晰筛,筆者認(rèn)為這個(gè)是因?yàn)楹?jiǎn)書服務(wù)端Session存儲(chǔ)著瀏覽器應(yīng)該顯示字體嫡丙,(比如服務(wù)端存儲(chǔ)著瀏覽器的某個(gè)唯一的id,然后當(dāng)重新打開瀏覽器读第,對(duì)服務(wù)端做請(qǐng)求時(shí)曙博,服務(wù)端根據(jù)之前的Session下發(fā)繁體內(nèi)容)。

Cookie的屬性

  • Domain(域):Cookie的域怜瞒;瀏覽器只向指定域中的服務(wù)器主機(jī)名發(fā)送Cookie父泳,這樣服務(wù)器就將Cookie限制在了特定的域中。jianshu.com域就與jianshu1.jianshu.com和jianshu1.jianshu2.jianshu.com相匹配吴汪,但與js.com就不匹配了惠窄。
  • Path(路徑):通過(guò)這個(gè)屬性可以為服務(wù)器上特定的文檔分配Cookie,如果Path屬性是一個(gè)URL路徑前綴漾橙,就可以附加一個(gè)Cookie杆融,路徑/foo,與/foobar和foo/bar.html相匹配霜运,路徑"/"與域名中所有的內(nèi)容都匹配擒贸。
  • Secure(安全):是否只有在HTTP使用SSL連接時(shí)才發(fā)送這個(gè)Cookie;
  • expires(過(guò)期):從格林尼治標(biāo)準(zhǔn)時(shí)間1970年1月1日00:00:00開始的過(guò)期秒數(shù)觉渴;
  • 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的過(guò)期時(shí)間瓣距;
  • NSHTTPCookieDiscard sessionOnly:一個(gè)布爾值,表示cookie是否應(yīng)該在會(huì)話結(jié)束的時(shí)候被丟棄(不管過(guò)期日期)代咸;
  • HTTPOnly:指定客戶端不要與JavaScript應(yīng)用共享Cookie蹈丸,以防止跨站腳本攻擊;
  • NSHTTPCookieSecure secure:指定Cookie只會(huì)用在HTTPS連接而非HTTP連接;
  • properties:Cookie的屬性逻杖;
  • NSHTTPCookiePropertyKey:定義cookie屬性字典中支持的常量奋岁;
  • NSHTTPCookieComment comment:Cookie的說(shuō)明文字
  • NSHTTPCookieCommentURL commentURL:cookie的說(shuō)明URL;
  • NSHTTPCookieAcceptPolicy:Cookie的訪問權(quán)限荸百,NSHTTPCookie由NSHTTPCookieStorage管理闻伶。
    • NSHTTPCookieAcceptPolicyAlways:存儲(chǔ)所有的cookie;
    • NSHTTPCookieAcceptPolicyNever:不會(huì)存儲(chǔ)cookie够话;
    • NSHTTPCookieAcceptPolicyOnlyFromMainDocumentDomain:只保存域值和請(qǐng)求域相匹配的Cookie蓝翰;

iOS 網(wǎng)絡(luò)請(qǐng)求使用Cookie

客戶端的請(qǐng)求頭里邊的cookie的header,key為"cookie"

服務(wù)端響應(yīng)客戶端的時(shí)候女嘲,響應(yīng)頭中的cookie的header筛欢,key為"set-cookie"

  • 網(wǎng)絡(luò)請(qǐng)求使用AFN攜帶Cookie
    測(cè)試AFN網(wǎng)絡(luò)請(qǐng)求攜帶Cookie,筆者使用的是訪問juejin.im的時(shí)候攜帶Cookie鲜侥,效果如下圖:
    AFNJuejinCookie.png

相關(guān)代碼如下:

    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) {
    }];

當(dāng)需要設(shè)置多個(gè)cookie值的時(shí)候摸屠,使用cookieKey1=cookieValue1;cookieKey2=cookieValue2;的方式,使用分號(hào)分隔開每一對(duì)cookieKey及Value媒至。

  • 網(wǎng)絡(luò)請(qǐng)求使用NSURLSession攜帶Cookie

測(cè)試NSURLSession網(wǎng)絡(luò)請(qǐng)求攜帶Cookie顶别,筆者使用的是訪問jianshu.com的時(shí)候攜帶Cookie,效果如下圖:


NSURLSessionJianshuCookie.png

相關(guān)代碼如下:

    NSURL *url = [NSURL URLWithString:@"http://www.reibang.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:

更多相關(guān)內(nèi)容拒啰,可查看 QiNetwork

參考學(xué)習(xí)網(wǎng)址


推薦文章:
iOS 圖標(biāo)&啟動(dòng)圖生成器(一)
算法小專欄:“D&C思想”與“快速排序”
iOS 避免常見崩潰(二)
算法小專欄:選擇排序
iOS Runloop(一)
iOS 常用調(diào)試方法:LLDB命令
iOS 常用調(diào)試方法:斷點(diǎn)
iOS 常用調(diào)試方法:靜態(tài)分析

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市谋旦,隨后出現(xiàn)的幾起案子剩失,更是在濱河造成了極大的恐慌,老刑警劉巖册着,帶你破解...
    沈念sama閱讀 218,682評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拴孤,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡甲捏,警方通過(guò)查閱死者的電腦和手機(jī)演熟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)司顿,“玉大人芒粹,你說(shuō)我怎么就攤上這事〈罅铮” “怎么了化漆?”我有些...
    開封第一講書人閱讀 165,083評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)钦奋。 經(jīng)常有香客問我座云,道長(zhǎng)疙赠,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,763評(píng)論 1 295
  • 正文 為了忘掉前任疙教,我火速辦了婚禮棺聊,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘贞谓。我一直安慰自己限佩,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,785評(píng)論 6 392
  • 文/花漫 我一把揭開白布裸弦。 她就那樣靜靜地躺著祟同,像睡著了一般。 火紅的嫁衣襯著肌膚如雪理疙。 梳的紋絲不亂的頭發(fā)上晕城,一...
    開封第一講書人閱讀 51,624評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音窖贤,去河邊找鬼砖顷。 笑死,一個(gè)胖子當(dāng)著我的面吹牛赃梧,可吹牛的內(nèi)容都是我干的滤蝠。 我是一名探鬼主播,決...
    沈念sama閱讀 40,358評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼授嘀,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼物咳!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起蹄皱,我...
    開封第一講書人閱讀 39,261評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤览闰,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后巷折,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體压鉴,經(jīng)...
    沈念sama閱讀 45,722評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年锻拘,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了油吭。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,030評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡逊拍,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出际邻,到底是詐尸還是另有隱情芯丧,我是刑警寧澤,帶...
    沈念sama閱讀 35,737評(píng)論 5 346
  • 正文 年R本政府宣布世曾,位于F島的核電站缨恒,受9級(jí)特大地震影響谴咸,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜骗露,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,360評(píng)論 3 330
  • 文/蒙蒙 一岭佳、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧萧锉,春花似錦珊随、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至禀崖,卻和暖如春衩辟,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背波附。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工艺晴, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人掸屡。 一個(gè)月前我還...
    沈念sama閱讀 48,237評(píng)論 3 371
  • 正文 我出身青樓封寞,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親折晦。 傳聞我的和親對(duì)象是個(gè)殘疾皇子钥星,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,976評(píng)論 2 355