Cookie向服務(wù)器提供了追蹤會(huì)話狀態(tài)能力,Cookie的值由服務(wù)器通過(guò)請(qǐng)求提供,然后被放到隨后的請(qǐng)求中。Cookie基本上幾十到幾百個(gè)字節(jié)
IOS 中Cookie類為 NSHTTPCookie
常見(jiàn)Cookie屬性
name - Cookie 的名字, 從同一 DNS 域返回的所有 Cookie 名都是唯一的. 只有 name 和 value 這兩個(gè)屬性才會(huì)在后續(xù)的請(qǐng)求中發(fā)送給服務(wù)器.
value - 由向服務(wù)器發(fā)送的下一請(qǐng)求返回的值
domain - 后續(xù)請(qǐng)求在 Cookie 中包含的 DNS 域. 比如, 擁有域值.domain1.col 的 Cookie 不應(yīng)該返回給.domain2.com . 如果省略掉, 那么客戶端就會(huì)將 URL 的主機(jī)名當(dāng)作域. 如果域的最前面是個(gè)圓點(diǎn)(.), 那么 Cookie 就會(huì)返回給發(fā)送到該域及其子域的任何請(qǐng)求. 如果沒(méi)有最前面的圓點(diǎn), 那么 Cookie 就只會(huì)包含在發(fā)送給該域而非其子域的請(qǐng)求中.
path - path 限制發(fā)送給請(qǐng)求的 Cookie 都是針對(duì)指定的 URL 路徑. 如果與 DNS 域搭配使用, 那么 path 屬性就可以限制只會(huì)將 Cookie 發(fā)送給服務(wù)器上有限且精確的 URL 集合.
Expiration Date - Cookie 不再隨請(qǐng)求發(fā)送的日期與時(shí)間, Cookie 會(huì)在這個(gè)時(shí)間點(diǎn)從客戶端存儲(chǔ)中刪除
Session Only - 指定 Cookie 是在當(dāng)前瀏覽器會(huì)話時(shí)間內(nèi)返回還是一直持續(xù)到過(guò)期日期, 以二者之間先到的時(shí)間為準(zhǔn). 在 iOS 應(yīng)用中, 會(huì)話指的是 OS 加載應(yīng)用到終止應(yīng)用之間的應(yīng)用生命周期.
Secure - 指定 Cookie 只會(huì)用在 HTTPS 連接而非 HTTP 連接上
Comment - 用于向用戶說(shuō)明 Cookie 目的的注釋值
Comment URL - URL 值, 向用戶提供了一個(gè) HTML 文檔, 用于說(shuō)明 Cookie 的目的
HTTP Only - 指示器, 告訴客戶端不要與 JavaScript 應(yīng)用共享 Cookie 以防止跨站腳本攻擊
Version - Cookie 遵循的 HTTP Cookie 規(guī)范版本
URL 加載系統(tǒng)會(huì)自動(dòng)處理HTTP與HTTPS 請(qǐng)求的Cookie。會(huì)將返回的Cookie保持在響應(yīng)中,然后按照Cookie處理規(guī)則將其添加到隨后的請(qǐng)求中。
URL 加載系統(tǒng)提供NSHTTPCookieStorage 管理Cookie,該對(duì)象為單例,與所有其他的應(yīng)用數(shù)據(jù)一樣, NSHTTPCookieStorage Cookie也是沙箱的, 無(wú)法在應(yīng)用間共享。
NSHTTPCookieStorage 默認(rèn)會(huì)存儲(chǔ)響應(yīng)中返回的所有Cookie,無(wú)論Cookie的域是否匹配請(qǐng)求的域,可以通過(guò)修改Cookie接受策略進(jìn)行更改
/*!
@method cookieAcceptPolicy
@abstract The cookie accept policy preference of the
receiver.
*/
@property NSHTTPCookieAcceptPolicy cookieAcceptPolicy;
NSHTTPCookieAcceptPolicyAlways - 這是默認(rèn)值, 表示任何返回的 Cookie 都應(yīng)該被保存下來(lái)
NSHTTPCookieAcceptPolicyNever - 這個(gè)值表示不應(yīng)該存儲(chǔ) Cookie
NSHTTPCookieAcceptPolicyOnlyFromMainDocumentDomain - 該策略告訴 NSHTTPCookieStorage 對(duì)象只保存域值與請(qǐng)求域相匹配的 Cookie
一、從響應(yīng)中獲取Cookie
NSHTTPURLResponse 中含有allHeaderFields 屬性,該屬性含有HTTP返回頭部信息,從中提取Cookie
/*!
@method allHeaderFields
@abstract Returns a dictionary containing all the HTTP header fields
of the receiver.
@discussion By examining this header dictionary, clients can see
the "raw" header information which was reported to the protocol
implementation by the HTTP server. This may be of use to
sophisticated or special-purpose HTTP clients.
@result A dictionary containing all the HTTP header fields of the
receiver.
*/
@property (readonly, copy) NSDictionary *allHeaderFields;
NSURL *url = [NSURL URLWithString:@"https://www.baidu.com"];
NSMutableURLRequest *req = [NSMutableURLRequest requestWithURL:url];
NSHTTPURLResponse *response;
NSError *error;
[NSURLConnection sendSynchronousRequest:req returningResponse:&response error:&error];
NSDictionary *heades = [response allHeaderFields];
NSArray *cookies = [NSHTTPCookie cookiesWithResponseHeaderFields:heades forURL:url];
for (NSHTTPCookie *cookie in cookies) {
NSLog(@"%@%@\n", cookie.name, cookie.value);
}
刪除Cookie
操作應(yīng)用中存儲(chǔ)的cookie, 刪除所有Cookie
- (void)deleteAllCookies{
NSHTTPCookieStorage *cookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
NSArray *cookies = [cookieStorage cookies];
for (NSHTTPCookie *cookie in cookies) {
[cookieStorage deleteCookie:cookie];
}
[[NSUserDefaults standardUserDefaults] synchronize];
}
可以組合使用Cookie屬性,針對(duì)特定Url,刪除Cookie
/*!
@method cookiesForURL:
@abstract Returns an array of cookies to send to the given URL.
@param URL The URL for which to get cookies.
@result an NSArray of NSHTTPCookie objects.
@discussion The cookie manager examines the cookies it stores and
includes those which should be sent to the given URL. You can use
<tt>+[NSCookie requestHeaderFieldsWithCookies:]</tt> to turn this array
into a set of header fields to add to a request.
*/
- (nullable NSArray<NSHTTPCookie *> *)cookiesForURL:(NSURL *)URL;
- (void)deleteCookie:(NSString *)cookieName url:(NSURL *)url{
NSHTTPCookieStorage *cookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
NSArray *storedCookies = [cookieStorage cookiesForURL:url];
for (NSHTTPCookie *cookie in storedCookies) {
if ([cookie.name isEqualToString:cookieName]) {
[cookieStorage deleteCookie:cookie];
}
}
[[NSUserDefaults standardUserDefaults] synchronize];
}
創(chuàng)建Cookie
手動(dòng)創(chuàng)建Cookie并通過(guò)編程的方式添加到請(qǐng)求或Cookie存儲(chǔ)中
1.添加到請(qǐng)求中
NSHTTPURLResponse *response = nil;
NSError *error = nil;
NSDate *date = [NSDate dateWithTimeIntervalSinceNow:60 * 60 * 24 * 7];
NSHTTPCookie *cookie163 = [NSHTTPCookie cookieWithProperties:@{ NSHTTPCookieName : @"NTES_SESS", //NTES_SESS NTES_TRIP163
NSHTTPCookieValue : @"cookieValue",
NSHTTPCookieDomain : @".163.com",
NSHTTPCookiePath : @"/",
NSHTTPCookieExpires : date }];
NSMutableURLRequest *req = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"https://www.163.com"]];
NSArray *cookieArray = [NSArray arrayWithObject:cookie163];
NSDictionary *newHeaders = [NSHTTPCookie requestHeaderFieldsWithCookies:cookieArray];
[req setAllHTTPHeaderFields:newHeaders];
[NSURLConnection sendSynchronousRequest:req returningResponse:&response error:&error];
通過(guò)設(shè)置HTTP請(qǐng)求頭信息,會(huì)將包含Cookie信息的新頭替換掉默認(rèn)的頭內(nèi)容。如果代碼中需要添加其他頭信息,需要在調(diào)用setAllHttpHeaderFields:之前將其添加到字典中。
2、Cookie存儲(chǔ)到本地方式
NSDate *date = [NSDate dateWithTimeIntervalSinceNow:60 * 60 * 24 * 7];
NSHTTPCookie *cookie163 = [NSHTTPCookie cookieWithProperties:@{ NSHTTPCookieName : @"NTES_SESS", //NTES_SESS NTES_TRIP163
NSHTTPCookieValue : @"cookieValue",
NSHTTPCookieDomain : @".163.com",
NSHTTPCookiePath : @"/",
NSHTTPCookieExpires : date }];
[[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookie163];
[[NSUserDefaults standardUserDefaults] synchronize];
存儲(chǔ)完成后,再新的請(qǐng)求執(zhí)行時(shí),會(huì)自動(dòng)將其從Cookie存儲(chǔ)中取出來(lái)