1 cookie
cookie與cache類似,我們大致按照分析cache的思路分析一下cookie,分為以下幾步:
- 檢查與設(shè)置cookie;
- 用不用cookie;
- cookie策略
1.1檢查cookie
與cache類似的是系統(tǒng)指定了默認(rèn)的cookie單例,如下:
NSHTTPCookieStorage *cookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
與cache不同的是,sharedHTTPCookieStorage 是一個(gè)只讀屬性,即cookie我們改變默認(rèn)的cookie對(duì)象,這一部分會(huì)在下一小結(jié)分析。我們依舊可以查詢和設(shè)置cookie對(duì)象中的內(nèi)容,只是不能把對(duì)象整個(gè)替換掉。
NSHTTPCookieStorage是存儲(chǔ)cookie的對(duì)象,里面的內(nèi)容是NSHTTPCookie對(duì)象。如下圖:

查詢cookie單例中的內(nèi)容,代碼如下:
NSArray *cookies = [NSHTTPCookieStorage sharedHTTPCookieStorage].cookies;
[cookies enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
if (![obj isKindOfClass:[NSHTTPCookie class]]) {
@throw @"this is not cookie";
}
NSHTTPCookie *cookie = (NSHTTPCookie*)obj;
NSLog(@"%@",cookie.domain);
NSLog(@"%@",cookie.name);
NSLog(@"%@",cookie.value);
}];
對(duì)cookie的增刪改查,系統(tǒng)提供了如下方法:
- (void)setCookie:(NSHTTPCookie *)cookie;
- (void)deleteCookie:(NSHTTPCookie *)cookie;
- (void)removeCookiesSinceDate:(NSDate *)date NS_AVAILABLE(10_10, 8_0);
1.2 用不用cookie
NSHTTPCookieStorage沒有像cache一樣提供init方法,因此我們也沒法指定自己的cookie對(duì)象用于緩存。猜測(cè)蘋果壓根就沒想開放出不同session用不同的cookie對(duì)象。注意NSHTTPCookie是提供了init方法的。
雖然不能指定cookie的存儲(chǔ)對(duì)象,但是我們可以選擇用不用cookie。當(dāng)某個(gè)session的所有請(qǐng)求都不需要cookie時(shí),我們有三種方式:
-
將HTTPCookieStorage設(shè)為nil
這樣cookie將無(wú)處安放,也就沒有cookie; -
將HTTPCookieAcceptPolicy設(shè)為NSHTTPCookieAcceptPolicyNever
客戶端不接受服務(wù)器發(fā)來(lái)的cookie -
HTTPShouldSetCookies設(shè)為NO
發(fā)送請(qǐng)求時(shí)不帶cookie -
HTTPShouldHandleCookies為NO
如果單個(gè)請(qǐng)求想不帶cookie可以設(shè)置NSMutableURLRequest的HTTPShouldHandleCookies為NO。
1.3 cookie策略
上一節(jié)中講到,影響整個(gè)session cache行為的是NSURLSessionConfiguration的requestCachePolicy屬性。而影響整個(gè)session cookie行為的是NSURLSession的HTTPCookieAcceptPolicy屬性和HTTPShouldSetCookies的開關(guān)。這兩個(gè)屬性的不同是:HTTPCookieAcceptPolicy策略決定客戶端何時(shí)存儲(chǔ)服務(wù)器發(fā)送來(lái)的cookie;HTTPShouldSetCookies決定客戶端發(fā)送請(qǐng)求時(shí)帶不帶cookie。NSMutableURLRequest只有HTTPShouldHandleCookies這個(gè)開關(guān)來(lái)決定是否帶cookie請(qǐng)求。作為一個(gè)請(qǐng)求,它沒法決定是否存儲(chǔ)cookie。
1.3.1 NSHTTPCookieAcceptPolicy
HTTPCookieAcceptPolicy有如下三中策略:
- NSHTTPCookieAcceptPolicyAlways
接受所有cookie - NSHTTPCookieAcceptPolicyNever
從來(lái)不接受cookie - NSHTTPCookieAcceptPolicyOnlyFromMainDocumentDomain
這個(gè)是默認(rèn)值,只會(huì)對(duì)主域名的Cookie進(jìn)行緩存,子域名或者請(qǐng)求資源的相關(guān)cookie并不會(huì)緩存。
在NSURLConfiguration中說(shuō)明HTTPCookieAcceptPolicy的默認(rèn)值是NSHTTPCookieAcceptPolicyOnlyFromMainDocumentDomain。而在NSHTTPCookieAcceptPolicy枚舉中說(shuō)明默認(rèn)的枚舉類型是NSHTTPCookieAcceptPolicyAlways。測(cè)試發(fā)現(xiàn)其默認(rèn)枚舉類型是NSHTTPCookieAcceptPolicyOnlyFromMainDocumentDomain。
1.3.2 HTTPShouldSetCookies與HTTPShouldHandleCookies
HTTPShouldSetCookies與HTTPShouldHandleCookies這一對(duì)開關(guān)影響請(qǐng)求是否使用cookie。HTTPShouldSetCookies是NSURLSession中的屬性,HTTPShouldHandleCookies是NSURLRequest的屬性。與cache類似,HTTPShouldHandleCookies的優(yōu)先級(jí)更高。當(dāng)HTTPShouldHandleCookies手動(dòng)設(shè)置為YESE時(shí),請(qǐng)求時(shí)必定會(huì)帶上本地的cookie。注意是手動(dòng)改為YES,如果保持默認(rèn)值不變系統(tǒng)就會(huì)以NSURLSession的HTTPShouldSetCookies為準(zhǔn)。HTTPShouldHandleCookies默認(rèn)值也是YES。HTTPShouldSetCookies設(shè)置為NO時(shí),所有通過(guò)該session的請(qǐng)求,在不修改HTTPShouldHandleCookies默認(rèn)值的情況下都不會(huì)帶有cookie。如果想帶有cookie,需要手動(dòng)設(shè)置請(qǐng)求header中的cookie。