一、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