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