享下最近項目用到的cookie的使用及管理
首先,先介紹下iOS對cookie的操作的兩個類:
帖子來源於:http://blog.csdn.net/chun799/article/details/17206907
1. NSHTTPCookie 2. NSHTTPCookieStorage
NSHTTPCookie對象代表一個HTTP cookie。 這是一個不可改變的對象,從一個包含cookie的屬性的字典初始化,這個類可以用來手動創建cookie的Properties 。
- (BOOL)isSessionOnly;等等屬性,具體屬性請自行谷歌
可以通過手工賦值的方式創建Cookie,如
+ (id)cookieWithProperties:(NSDictionary *)properties;
- (id)initWithProperties:(NSDictionary *)properties;
也可以從Cookie中讀取到所有屬性。
使用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)接收到系統中。
例如:
NSMutableDictionary *cookieProperties = [NSMutableDictionary dictionary]; // 創建cookie屬性字典
[cookieProperties setObject:@"username" forKey:NSHTTPCookieName]; // 手動設置cookie的屬性
[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]; // 通過NSHTTPCookie的cookieWithProperties方法,將屬性字典傳入進行初始化,對象返回的是一個NSHTTPCookie對象,創建完成後進行下一步操作:
[[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookie]; // 將手動創建返回的NSHTTPCookie對象添加到NSHTTPCookieStorage中,在iOS中使用NSHTTPCookie類封裝一條cookie,通過NSHTTPCookie的方法讀取到cookie的通用屬性。在此聲明一點:如果你的request裏面明確不使用cookie,那麼要講cookie的(HTTPShouldHandleCookies設爲NO),否則URL loading system會自動爲NSURLRequest發送合適的存儲cookie。
下面來介紹一下NSHTTPCookieStorage對象:
NSHTTPCookieStorage提供了管理所有NSHTTPCookie 對象的接口在OS X裏,cookie是在所有程序中共享的,而在iOS中,cookie只當當前應用中有效。
通過sharedHTTPCookieStorage方法可獲取到共享的NSHTTPCookieStorage單件對象。
+ (NSHTTPCookieStorage *)sharedHTTPCookieStorage;
使用NSHTTPCookieStorage單件對象可獲取到當前存儲的所有cookie
或針對特定URL的cookie
- (NSArray *)cookiesForURL:(NSURL *)theURL;
還可以添加/刪除Cookie
– setCookies:forURL:mainDocumentURL:
通過NSHTTPCookieStorage可讀取/修改cookie接收策略,默認爲NSHTTPCookieAcceptPolicyAlways.
- (NSHTTPCookieAcceptPolicy)cookieAcceptPolicy;
- (void)setCookieAcceptPolicy:(NSHTTPCookieAcceptPolicy)aPolicy.
一共有三種cookie accept policy。typedef enum {
NSHTTPCookieAcceptPolicyAlways,
NSHTTPCookieAcceptPolicyNever,
NSHTTPCookieAcceptPolicyOnlyFromMainDocumentDomain
NSHTTPCookieAcceptPolicyAlways:接收所有cookie,默認策略.
NSHTTPCookieAcceptPolicyNever: 拒絕所有cookie
NSHTTPCookieAcceptPolicyOnlyFromMainDocumentDomain:只接收main document domain中的cookie.
四.相關通知
NSHTTPCookieManagerCookiesChangedNotification
當NSHTTPCookieStorage實例中的cookies變化時發出此通知。
NSHTTPCookieManagerAcceptPolicyChangedNotification
當NSHTTPCookieStorage實例的cookie acceptance policy變化時發出此通知。
參考:
NSHTTPCookieStorage Class Reference
URL Loading System Programming Guide – Cookie Storage
以上是對這兩個類的綜合介紹,如果有不懂,請自行百度或谷歌。
正文
說了這麼多,就來寫下我項目中用到的cookie管理
我這個操作是保存NSHTTPCookieStorage對象裏的所有cookie,當然也可以使用cookieForUrl來獲取cookie進行保存,方便後續的使用。此操作是在登錄的時候進行。
下面:
這個方法就是更新cookie。在程序每次啓動的時候調用一下。用來確保每次的cookie是最新的。
然後:
這個方法就是移除你保存的cookie了。因爲你在退出賬戶的時候需要重新獲取新的cookie,所以,你需要在退出賬戶的時候清空你上次保存的cookie. 大概就是這麼多操作。
staticNSString*kLocalCookieName =@"MyProjectCookie";
staticNSString*kLocalUserData =@"MyProjectLocalUser";
staticNSString*kServerSessionCookie =@"JSESSIONID";
最後
寫的不好,也沒排版,請見諒。
原文鏈接:http://www.jianshu.com/p/65094611980c
著作權歸作者所有,轉載請聯繫作者獲得授權,並標註“簡書作者”。