NSURLSession系列(五)- cookie

1 cookie

cookie與cache類似,我們大致按照分析cache的思路分析一下cookie,分為以下幾步:

  1. 檢查與設(shè)置cookie;
  2. 用不用cookie;
  3. 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ì)象。如下圖:


cookie1.png

查詢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。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,506評(píng)論 19 139
  • iOS開發(fā)系列--網(wǎng)絡(luò)開發(fā) 概覽 大部分應(yīng)用程序都或多或少會(huì)牽扯到網(wǎng)絡(luò)開發(fā),例如說(shuō)新浪微博、微信等,這些應(yīng)用本身可...
    lichengjin閱讀 4,023評(píng)論 2 7
  • 子曰:“巧言令色,鮮矣仁!”巧,好。令,善也。好其言,善其色,致飾于外,務(wù)以悅?cè)?,則人欲肆而本心之德亡矣。圣人辭不...
    bodhi1984閱讀 1,941評(píng)論 0 0
  • 事實(shí)擺在那里,再出色的公關(guān)也無(wú)濟(jì)于事,只能被動(dòng)的接受世人的指責(zé)或嘲笑,曾經(jīng)用心建立起的好形象破碎了,蒸蒸日上的事業(yè)...
    Sara_馨閱讀 219評(píng)論 0 0
  • 轉(zhuǎn)眼畢業(yè)在即,我們即將作為成年人邁向紛繁復(fù)雜的社會(huì),大家或多或少都會(huì)成長(zhǎng)和改變,然而令人驚掉下巴的是,竟然...
    韓忍冬閱讀 350評(píng)論 0 0

友情鏈接更多精彩內(nèi)容