Cookie 介紹
Cookie 是瀏覽器儲存在用戶電腦上的一小段文本文件。cookie 是純文本格式,不包含任何可執(zhí)行的代碼弦叶。一個 Web 頁面或服務(wù)器告知瀏覽器按照一定規(guī)范來儲存這些信息烛愧,并在隨后的請求中將這些信息發(fā)送至服務(wù)器站刑。cookie 只包含數(shù)據(jù)脂凶,就其本身而言并不有害浪册。Cookie 用來解決在無狀態(tài)協(xié)議 HTTP 下扫腺,不同請求間發(fā)送持久化的數(shù)據(jù),比如 Web 服務(wù)器如何識別不同的用戶村象,大多數(shù)需要登錄的網(wǎng)站在用戶驗證成功之后都會設(shè)置一個 cookie笆环,只要這個 cookie 存在攒至,用戶就可以自由瀏覽這個網(wǎng)站的任意頁面。
Web 服務(wù)器通過在 HTTP 響應(yīng)頭中添加 Set-Cookie 字段來創(chuàng)建一個 cookie躁劣,格式為
Set-Cookie: value[; expires=date][; domain=domain][; path=path][; secure]
value 的一般形式為name=value
迫吐。expires 指明了 cookie 的過期時間,cookie 過期后會被刪除账忘,若不指明志膀,cookie 則會在瀏覽器關(guān)閉時失效。domain 和 path 則規(guī)定了需要發(fā)送 cookie 的匹配范圍鳖擒。最后溉浙,secure 聲明了只在 HTTPS 協(xié)議下才發(fā)送 cookie。
當設(shè)置 cookie 后蒋荚,瀏覽器在發(fā)送請求時戳稽,在請求頭中就會帶上 cookie,只有 value 會被發(fā)送給服務(wù)器期升,其他的可選項都是用來指定瀏覽器的行為的惊奇。
Cookie: value1; value2; name1=value1
NSHTTPCookie
在 Foundation 框架中,通過 NSHTTPCookie 類表示了 cookie播赁。創(chuàng)建方法如下:
+ cookiesWithResponseHeaderFields:forURL
+ cookieWithProperties:
- cookieWithProperties:
其中+ cookiesWithResponseHeaderFields:forURL
根據(jù) headerFields 的 Set-Cookie 來返回 NSHTTPCookie 實例的數(shù)組颂郎,若 Set-Cookie 的值未指明 domain 和 path 時,則以 url 來設(shè)置相關(guān)屬性行拢。NSHTTPCookie
類還提供了方法
+ requestHeaderFieldsWithCookies:
用于逆向?qū)⒁唤MNSHTTPCookie
實例轉(zhuǎn)化為用于設(shè)置請求頭的字典祖秒。
而另外一組創(chuàng)建方法則以基于 NSHTTPCookiePropertyKey 的字典為參數(shù),其中必須提供NSHTTPCookiePath舟奠、NSHTTPCookieValue竭缝、NSHTTPCookieName、NSHTTPCookieDomain 或 NSHTTPCookieOriginURL 的值沼瘫。NSHTTPCookie
類提供了相應(yīng)的屬性來讀取對應(yīng)值抬纸。
NSHTTPCookieComment
NSHTTPCookieCommentURL
// 指明 cookie 是否只在 session 內(nèi)有效
NSHTTPCookieDiscard
NSHTTPCookieDomain
NSHTTPCookieExpires
NSHTTPCookieMaximumAge
NSHTTPCookieName
// 設(shè)置 cookie 的 URL
NSHTTPCookieOriginURL
NSHTTPCookiePath
NSHTTPCookiePort
NSHTTPCookieSecure
NSHTTPCookieValue
NSHTTPCookieVersion
NSHTTPCookieStorage
Foundation 框架還提供了 NSHTTPCookieStorage 類來管理 cookie 的存儲。它提供了共享的單例耿戚,當然也可以單獨創(chuàng)建新的實例
sharedHTTPCookieStorage
- initWithStorageLocation:
NSHTTPCookieStorage
實例對 cookie 的存儲受枚舉類型NSHTTPCookieAcceptPolicy
屬性cookieAcceptPolicy
的影響湿故,它可能的值包括:
// 默認值,接收所有 cookie
NSHTTPCookieAcceptPolicyAlways
// 拒絕所有 cookie
NSHTTPCookieAcceptPolicyNever
// 配合 NSURLRequest 中的 mainDocumentURL 屬性使用
NSHTTPCookieAcceptPolicyOnlyFromMainDocumentDomain
注意膜蛔,在 iOS 中 cookie 并不在所有應(yīng)用中共享坛猪,每個應(yīng)用只能維護自己的 cookie。
URL Loading System 中的應(yīng)用
通過 URL Loading System 發(fā)起網(wǎng)絡(luò)請求獲取數(shù)據(jù)時皂股,可通過
NSURLSessionConfiguration
實例配置 cookie 相關(guān)選項:
// session 使用的 NSHTTPCookieStorage 實例
HTTPCookieStorage
// 指定 session 的 cookie 保存策略
HTTPCookieAcceptPolicy
// 指明請求時是否從 NSHTTPCookieStorage 獲取對應(yīng)的 cookie 并發(fā)送
HTTPShouldSetCookies
之后 URL Loading System 在發(fā)送請求和處理響應(yīng)時墅茉,會根據(jù)配置的行為,自動的獲取和發(fā)送 cookie。