iOS:项目中用到的Cookie
1、介紹:
做了這么長時間開發,Cookie真是用的不多,可是現在不一樣了,這次的項目我用到了Cookie。其實,Cookie的使用在項目中愈加的頻繁,一般情況下,提供的接口是用Cookie來識別用戶信息的,所以需要在每次請求的時候附帶上指定的Cookie,以及在登陸后保存Cookie。當然,也有將Token放在Cookie中,然后調用接口獲取用戶的敏感數據。
?
2、好處:
首先,Session是會過期的,所以存儲再調用是沒有任何意義的,更合適的做法是在獲取到過期信息及時刷新Cookie。
其次,Cookie的管理和加載是系統本身已經做好的,如果自行保存和加載,反而累贅,就是你需要在很多地方去考慮要不要保存,要不要清除。
最后,AFN這個框架中就有專門對Cookie的處理,它會自動的將Cookie保存到本地,然后在發送請求時會自動調用本地的Cookie,快速高效,簡單安全。
?
3、用的類:NSHTTPCookieStorage
AFN自己是不管理Cookie的,它使用的是Foundation底層的Cookie管理工具。
所有有關Cookie的設置和獲取都可以通過這個類來實現。
當我們在使用AFN發送請求之前,手動設置了這個Cookie,在發送請求的時候就會把這段自動加到請求頭信息中。(我猜應該是每次發送請求都會自動帶上Cookie)
NSHTTPCookieStorage?
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.
相關通知
NSHTTPCookieManagerCookiesChangedNotification
當NSHTTPCookieStorage實例中的cookies變化時發出此通知。
NSHTTPCookieManagerAcceptPolicyChangedNotification
當NSHTTPCookieStorage實例的cookie acceptance policy變化時發出此通知。
對于它的更多介紹:http://blog.csdn.net/chun799/article/details/17206907
?
4、保存和獲取Cookie的方法(kCookie是一個字符串常量,作為保存/讀取的Key值)
- 保存Cookie到本地
解釋:上面這段代碼的作用是保存當前Cookie到本地,我通常會在用戶登錄請求成功返回后調用這段代碼將這次的Cookie進行保存,這樣下次再發起其他的訪問請求時候就可以取到這段Cookie
- 從本地獲取Cookie
解釋:上段的代碼實現的就是獲取到本地的Cookie,然后設置CookieStorage,這樣在下載請求時候就會自動帶上這段Cookie。我是在每次請求發送之前執行這段代碼。
?
5、擴展
- 事實上保存Cookie并不是僅僅在用戶登錄結束后執行的,比如在有圖片驗證碼的時候,每次刷新圖片驗證碼,也都是需要更新Cookie的(因為需要更新的Cookie里面的SessionID)。所以可以對外提供一個方法,這樣在需要保存Cookie的時候調用方法就可以。至此Cookie問題解決,實測可以正常獲取和傳遞Token等。(在我的項目中Cookie只是包含了SessionId,大家也可以根據需要往里面自由添加其他字段,畢竟Cookie已經取到了!)
- WebView加載鏈接加Cookie的方法,代碼以及思路如下:
- 首先取到要加載的Cookie。我這里就是之前寫的那堆保存在本地的,一個NSArray類型的東西,kCookie是常量(好像是第二次說了),就是保存和讀取的Key值。 NSArray * cookies = [NSKeyedUnarchiver unarchiveObjectWithData: [[NSUserDefaults standardUserDefaults] objectForKey:kCookie]];
- 然后啟封NSHTTPCookieStorage,它有一個方法可以給指定URL加Cookie,大概是長下面這樣: NSHTTPCookieStorage * cookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage]; [cookieStorage setCookies:cookies forURL:url mainDocumentURL:nil];
- 解釋:這里面有兩個參數可以設置,cookies當然就是我們剛才取到的Cookie數組,url就是要加上Cookie的指定url,對我來說就是上面的@"酷炫網頁的鏈接"。參數設置完畢,其他的就沒問題啦!(什么?mainDocumentURL?這啥?不知道!填nil就可以了!)
- 總體代碼: NSString * urlStr = @"酷炫網頁的鏈接"; NSURL * url = [NSURL URLWithString:urlStr]; NSArray * cookies = [NSKeyedUnarchiver unarchiveObjectWithData: [[NSUserDefaults standardUserDefaults] objectForKey:kCookie]]; NSHTTPCookieStorage *cookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage]; [cookieStorage setCookies:cookies forURL:url mainDocumentURL:nil]; NSURLRequest *request = [NSURLRequest requestWithURL:url]; [self.webView loadRequest:request];
?
6、Cookie使用范例:
1,獲取cookie
獲取cookie只能在請求中獲取cookie,否則時獲取不到的,url就不給出了,大家用自己的url測試一下就行。
獲取到cookie后把cookie進行歸檔保存到userDefaults里
2,刪除cookie
把獲取到的cookie刪除掉,該步驟可以用在注銷或者切換賬號里。
當前,我這里刪除cookie是為了檢測后面的通過本地存儲的數據進行設置cookie是否成功
3,通過本地存儲的數據設置cookie
把本地的cookie取出并反歸檔,設置到cookie中,并且檢測cookie是否設置成功
4、打印截圖:
?
Demo:CookieText
?
7、我項目中用到的Cookie:
//1.創建請求管理對象AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript",@"text/html",@"text/plain",nil];//2.添加cookie[manager.requestSerializer setValue:[NSString stringWithFormat:@"token=%@",token] forHTTPHeaderField:@"Cookie"];//3.發送請求[manager GET:url parameters:params progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {}];引用博客:
Bear:http://blog.it985.com/11248.html
Zhang_yD:http://www.jianshu.com/p/5f52d2c6be7b
轉載于:https://www.cnblogs.com/XYQ-208910/p/6075459.html
總結
以上是生活随笔為你收集整理的iOS:项目中用到的Cookie的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: (转)java并发之Executor
- 下一篇: 061 hive中的三种join与数据倾