iOS 深入淺出 網(wǎng)絡編程之 NSHTTPCookie/NSHTTPCookieStorage

一、cookie 簡介

由于HTTP協(xié)議的無狀態(tài),客戶端經(jīng)常使用cookie來提供跨URL請求的數(shù)據(jù)持久存儲。URL加載系統(tǒng)提供了創(chuàng)建和管理cookie的接口,作為HTTP請求的一部分發(fā)送cookies,并在Web服務器的響應時接收cookie。等多cookie信息請前往百度百科cookie

二、使用cookie

首先,正常業(yè)務場景下,cookie最先是由服務器生成好
然后客服端請求接口,獲取到cookie,將cookie存儲起來。
最后,在每次網(wǎng)絡請求的時候附帶cookie

但是在iOS網(wǎng)絡請求中使用cookie還有1個條件,那就是在iOS中網(wǎng)絡請求類NSURLRequest中設置是否要使用cookie

/*!
決定這個請求是否要使用cookie,默認為YES
*/
@property BOOL HTTPShouldHandleCookies;

iOS 中cookie是一個NSHTTPCookie對象,它包含了各種各樣的屬性(properties)


// cookie 版本
// 版本0:此版本是指由Netscape定義的原始cookie格式的“傳統(tǒng)”或“舊式”cookie。遇到的大多數(shù)Cookie都是這種格式。
// 版本1:此版本是指RFC 2965(HTTP狀態(tài)管理機制)中定義的Cookie。
@property (readonly) NSUInteger version;

// cookie存儲信息的名字,比如:token
@property (readonly, copy) NSString *name;

// cookie存儲的信息,比如:8d2je219jjd0120d12e1212e12(token的值)
@property (readonly, copy) NSString *value;

// cookie有效期(過期,NSHTTPCookieStorage會自動刪除存儲的cookie)
@property (nullable, readonly, copy) NSDate *expiresDate;

// 是否應在會話結束時被丟棄(不管過期日期如何)
@property (readonly, getter=isSessionOnly) BOOL sessionOnly;

// cookie的域名
@property (readonly, copy) NSString *domain;

// 路徑
@property (readonly, copy) NSString *path;

// 該cookie是否應該僅通過安全通道發(fā)送
@property (readonly, getter=isSecure) BOOL secure;

// 是否應僅根據(jù)RFC 2965發(fā)送到HTTP服務器
@property (readonly, getter=isHTTPOnly) BOOL HTTPOnly;

// 端口列表
@property (nullable, readonly, copy) NSArray<NSNumber *> *portList;

三、接收cookie

假設當前有這么一個場景,客服端中用戶在登錄時服務器將當前用戶的token等相關信息存在cookie中返回給客戶端,客戶端在每次請求其他數(shù)據(jù)時都需要將此cookie信息(保存的用戶信息)攜帶,以便區(qū)分當前是哪個用戶。
那么我們要如何接收這個cookie呢,iOS中提供了NSHTTPCookieStorage這個類,來存儲服務器給我們發(fā)送的cookie,NSURLResponse根據(jù)會當前的NSHTTPCookieStorage接受策略自動接收返回的cookie并存儲在NSHTTPCookieStorage中,我們不需要做任何操作,在我們發(fā)送請求是,我們只需要設置HTTPShouldHandleCookies為YES(默認為YES), NSURLRequest會自動附帶cookie的信息發(fā)送給服務器。以下是三種接收策略:

typedef NS_ENUM(NSUInteger, NSHTTPCookieAcceptPolicy) {
    // 永遠接收Cookie,這種情況下,NSHTTPCookieStorage會將接收到的cookie 存儲在偏好設置中
    NSHTTPCookieAcceptPolicyAlways,
    // 永遠不接受Cookie,這種情況下,NSHTTPCookieStorage不會存儲cookie到本地
    NSHTTPCookieAcceptPolicyNever,
    // 只接收指定域名的Cookie
    NSHTTPCookieAcceptPolicyOnlyFromMainDocumentDomain
};

NSHTPCookieStorage對象是一個單例對象,它管理著所有的cookie,它提供了一些方法來允許客戶端設置和移除cookie,和獲取當前cookie的設置。

通過單例獲取NSHTTPCookieStorage對象


NSHTTPCookieStorage *cookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage];

NSHTPCookieStorage 設置、刪除、獲取

// cookie的接收策略
@property NSHTTPCookieAcceptPolicy cookieAcceptPolicy

// 獲取NSHTTPCookieStorage存儲的所有cookie
@property (nullable , readonly, copy) NSArray<NSHTTPCookie *> *cookies

// 設置cookie
- (void)setCookie:(NSHTTPCookie *)cookie

// 刪除cookie
- (void)deleteCookie:(NSHTTPCookie *)cookie

// 在某個時間點刪除cookies
- (void)removeCookiesSinceDate:(NSDate *)date

// 獲取指定URL的cookies
- (nullable NSArray<NSHTTPCookie *> *)cookiesForURL:(NSURL *)URL

// 獲取指定域名指定URL的cookies
- (void)setCookies:(NSArray<NSHTTPCookie *> *)cookies forURL:(nullable NSURL *)URL mainDocumentURL:(nullable NSURL *)mainDocumentURL

四、清除cookie

還有一個場景需要清除cookie,那就是在客戶端,用戶退出登錄,我們就需要刪除NSHTPCookieStorage中的cookie

    NSArray *cookies = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies];
    for (NSHTTPCookie *cookie in cookies) {
        [[NSHTTPCookieStorage sharedHTTPCookieStorage] deleteCookie:cookie];
    }

五、總結

總體來說,使用cookie我們要確認三步信息:
1.NSURLRequest是否允許使用cookie(HTTPShouldHandleCookies),默認允許。
2.NSHTTPCookieStorage的接收策略
3.退出時清除NSHTTPCookieStorage存儲的cookie

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

相關閱讀更多精彩內容

  • iOS網(wǎng)絡編程讀書筆記 Facade Tester客戶端門面模式的實例(被動版本化) 被動版本化,所以硬編碼URL...
    melouverrr閱讀 1,703評論 3 7
  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,554評論 19 139
  • cookie機制采用的是在客戶端保持 HTTP 狀態(tài)信息的方案 Cookie是在瀏覽器訪問WEB服務器的某個資源時...
    葛高召閱讀 3,142評論 0 0
  • 目錄 一、網(wǎng)絡編程基礎二、應用層通信協(xié)議三、HTTP協(xié)議演變過程四、請求(Request)和響應(Response...
    boundlessocean閱讀 936評論 0 5
  • 為什么學編程 為什么選擇Python 如何入門 為什么學編程 “你花了兩個小時做了我們兩天的工作!”同學去工作單位...
    肥貓FatCat閱讀 1,302評論 1 3

友情鏈接更多精彩內容