Cookie for iOS

cookie機制:

Cookie是在客戶端存儲服務器狀態的一種機制,Web服務器可以通過Set-Cookie或者Set-Cookie2 HTTP頭部設置Cookie。
Cookie是在瀏覽器訪問WEB服務器的某個資源時,由WEB服務器在HTTP響應消息頭中附帶傳送給瀏覽器的一個小文本文件。一旦WEB瀏覽器保存了某個Cookie,那么它在以后每次訪問該WEB服務器時,都會在HTTP請求頭中將這個Cookie回傳給WEB服務器。

底層的實現原理: WEB服務器通過在HTTP響應消息中增加Set-Cookie響應頭字段將Cookie信息發送給瀏覽器,瀏覽器則通過在HTTP請求消息中增加Cookie請求頭字段將Cookie回傳給WEB服務器。
一個Cookie只能標識一種信息,它至少含有一個標識該信息的名稱(NAME)和設置值(VALUE)。
一個WEB站點可以給一個WEB瀏覽器發送多個Cookie,一個WEB瀏覽器也可以存儲多個WEB站點提供的Cookie。
瀏覽器一般只允許存放300個Cookie,每個站點最多存放20個Cookie,每個Cookie的大小限制為4KB。

Cookie可以分為兩類,會話Cookie和持久Cookie,會話Cookie是臨時Cookie,當前會話結束(瀏覽器退出)時Cookie會被刪除。持久Cookie會存儲在用戶的硬盤上,瀏覽器退出,然后重新啟動后Cookie仍然存在。會話Cookie和持久Cookie的區別在于過期時間,如果設置了Discard參數(Cookie 版本1)或者沒有設置Expires(Cookie版本0)或Max-Age(Cookie版本1)設置過期時間,則此Cookie為會話Cookie
Cookie有兩個版本,一個是版本0(Netscape Cookies)和版本1(RFC 2965),目前大多數服務器使用的Cookie 0。
當然,cookie也應用到了我們iOS中,下面介紹一下iOS中的cookie:

NSHTTPCookie:

1.在iOS中使用NSHTTPCookie類封裝一條cookie,通過NSHTTPCookie的方法讀取到cookie的通用屬性。

- (NSUInteger)version;
- (NSString *)name;
- (NSString *)value;
- (NSString *)domain;
- (NSString *)path;
- (BOOL)isSessionOnly;等等

2.可以通過手工賦值的方式創建Cookie,如

+ (id)cookieWithProperties:(NSDictionary *)properties;
- (id)initWithProperties:(NSDictionary *)properties;

3.也可以從Cookie中讀取到所有屬性。

- (NSDictionary *)properties;

4.使用NSHTTPCookie的類方法可以將NSHTTPCookie實例與HTTP cookie header相互轉換.

根據NSHTTPCookie實例數組生成對應的HTTP cookie header
+ (NSDictionary *)requestHeaderFieldsWithCookies:(NSArray *)cookies;

從headerFileds中讀取到Cookie相關內容,生成NSHTTPCookie實例對象數組。
+ (NSArray *)cookiesWithResponseHeaderFields:(NSDictionary *)headerFields forURL:(NSURL *)theURL;

該方法會忽略headerFileds中與cookie無關的字段,如果headerFileds中的cookie沒有指定domain,則使用theURL的domain,如果沒有指定path,則使用”/”.

除非NSURLRequest明確指定不使用cookie(HTTPShouldHandleCookies設為NO),否則URL loading system會自動為NSURLRequest發送合適的存儲cookie。從NSURLResponse返回的cookie也會根據當前的cookie訪問策略(cookie acceptance policy)接收到系統中。

NSHTTPCookieStorage:

1.NSHTTPCookieStorage單件類提供了管理所有NSHTTPCookie對象的接口,在OS X里,cookie是在所有程序中共享的,而在iOS中,cookie只當當前應用中有效。

通過sharedHTTPCookieStorage方法可獲取到共享的NSHTTPCookieStorage單件對象。
+ (NSHTTPCookieStorage *)sharedHTTPCookieStorage;

使用NSHTTPCookieStorage單件對象可獲取到當前存儲的所有cookie
- (NSArray *)cookies

或針對特定URL的cookie
- (NSArray *)cookiesForURL:(NSURL *)theURL;

還可以添加/刪除Cookie
– deleteCookie:
– setCookie:
– setCookies:forURL:mainDocumentURL:

通過NSHTTPCookieStorage可讀取/修改cookie接收策略,默認為NSHTTPCookieAcceptPolicyAlways.
- (NSHTTPCookieAcceptPolicy)cookieAcceptPolicy;
- (void)setCookieAcceptPolicy:(NSHTTPCookieAcceptPolicy)aPolicy.

一共有三種cookie accept policy,
typedef enum {
   NSHTTPCookieAcceptPolicyAlways,
   NSHTTPCookieAcceptPolicyNever,
   NSHTTPCookieAcceptPolicyOnlyFromMainDocumentDomain
} NSHTTPCookieAcceptPolicy;

NSHTTPCookieAcceptPolicyAlways:接收所有cookie,默認策略.
NSHTTPCookieAcceptPolicyNever: 拒絕所有cookie
NSHTTPCookieAcceptPolicyOnlyFromMainDocumentDomain:只接收main document domain中的cookie.

2.相關通知Notification

NSHTTPCookieManagerCookiesChangedNotification
當NSHTTPCookieStorage實例中的cookies變化時發出此通知。
NSHTTPCookieManagerAcceptPolicyChangedNotification
當NSHTTPCookieStorage實例的cookie acceptance policy變化時發出此通知。

cookie的使用

當你利用一個URL請求時,NSURLRequest都會幫你主動記錄下來你訪問的站點設置的cookie(因為NSHTTPCookieStorage可讀取/修改cookie接收策略,默認為NSHTTPCookieAcceptPolicyAlways.當然你也可以給它設置為NSHTTPCookieAcceptPolicyNever: 拒絕所有cookie),而且很負責任的,當你下次再訪問這個站點時,NSURLRequest會拿著上次保存下來了的cookie繼續去請求。這規律同樣適用于 ASIHTTPRequest。所以當你做一些基于認證的網絡請求時,cookie不失為一個完美的解決方案。
1.怎么查看cookie?

NSHTTPCookieStorage *cookieJar = [NSHTTPCookieStorage sharedHTTPCookieStorage];
for (NSHTTPCookie *cookie in [cookieJar cookies]) {
       NSLog(@"%@", cookie);
}
這樣就列出了所有已保存的cookie,如果當前為空怎么辦呢?隨便請求一個url嘍。
NSURLRequest *request = [NSURLRequest requestWithURL:
[NSURL URLWithString:@"http://blog.cnrainbird.com"] cachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData    timeoutInterval:3];
[NSURLConnection sendSynchronousRequest:request 
                      returningResponse:nil 
                                     error:nil]; 

NSHTTPCookieStorage *cookieJar = [NSHTTPCookieStorage sharedHTTPCookieStorage];
for (NSHTTPCookie *cookie in [cookieJar cookies]) {
    NSLog(@"%@", cookie);
}

是不是得到了類似:
<NSHTTPCookie version:0 name:"PHPSESSID" value:"evf5rcboo8th1dnl53fs4ukmt2" expiresDate:(null) created:2012-03-13 14:28:13 +0000 (3.53342e+08) sessionOnly:TRUE domain:"blog.cnrainbird.com" path:"/" isSecure:FALSE>
的東東?這就是cookie啦

2.怎么清空cookie?

NSHTTPCookieStorage *cookieJar = [NSHTTPCookieStorage sharedHTTPCookieStorage];
NSArray *_tmpArray = [NSArray arrayWithArray:[cookieJar cookies]];
for (id obj in _tmpArray) {
    [cookieJar deleteCookie:obj];
}
這樣cookie就消失的一干二凈了。

3.會查看cookie了,也會清空cookie了,怎么設置指定的cookie呢?

NSMutableDictionary *cookieProperties = [NSMutableDictionary dictionary];
[cookieProperties setObject:@"username" forKey:NSHTTPCookieName];
[cookieProperties setObject:@"rainbird" forKey:NSHTTPCookieValue];
[cookieProperties setObject:@"cnrainbird.com" forKey:NSHTTPCookieDomain];
[cookieProperties setObject:@"cnrainbird.com" forKey:NSHTTPCookieOriginURL];
[cookieProperties setObject:@"/" forKey:NSHTTPCookiePath];
[cookieProperties setObject:@"0" forKey:NSHTTPCookieVersion];

NSHTTPCookie *cookie = [NSHTTPCookie cookieWithProperties:cookieProperties];
[[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookie];

這樣就可以了。輸入一下,是不是得到了下面這樣的結果:

<NSHTTPCookie version:0 name:"username" value:"rainbird" expiresDate:(null) crea
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容