日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

iOS:项目中用到的Cookie

發布時間:2024/8/26 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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到本地
NSData * cookiesData = [NSKeyedArchiver archivedDataWithRootObject: [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies]]; NSUserDefaults * defaults = [NSUserDefaults standardUserDefaults]; [defaults setObject: cookiesData forKey:kCookie]; [defaults synchronize];

解釋:上面這段代碼的作用是保存當前Cookie到本地,我通常會在用戶登錄請求成功返回后調用這段代碼將這次的Cookie進行保存,這樣下次再發起其他的訪問請求時候就可以取到這段Cookie

  • 從本地獲取Cookie
NSArray * cookies = [NSKeyedUnarchiver unarchiveObjectWithData: [[NSUserDefaults standardUserDefaults] objectForKey:kCookie]]; NSHTTPCookieStorage * cookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage]; for (NSHTTPCookie * cookie in cookies){[cookieStorage setCookie: 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里

#pragma mark 獲取并保存cookie到userDefaults - (void)getAndSaveCookie {NSLog(@"=============獲取cookie==============");NSString *urlString = @"";//請求一個網址,即可分配到cookieAFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];manager.responseSerializer = [AFJSONResponseSerializer new];[manager GET:urlString parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {//獲取cookieNSArray *cookies = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies];for (NSHTTPCookie *tempCookie in cookies) {//打印獲得的cookieNSLog(@"getCookie: %@", tempCookie);}/** 把cookie進行歸檔并轉換為NSData類型* 注意:cookie不能直接轉換為NSData類型,否則會引起崩潰。* 所以先進行歸檔處理,再轉換為Data*/NSData *cookiesData = [NSKeyedArchiver archivedDataWithRootObject: [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies]];//存儲歸檔后的cookieNSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];[userDefaults setObject: cookiesData forKey: @"cookie"];NSLog(@"\n");[self deleteCookie];[self setCoookie];} failure:^(AFHTTPRequestOperation *operation, NSError *error) {nil;}]; }

2,刪除cookie
把獲取到的cookie刪除掉,該步驟可以用在注銷或者切換賬號里。
當前,我這里刪除cookie是為了檢測后面的通過本地存儲的數據進行設置cookie是否成功

#pragma mark 刪除cookie - (void)deleteCookie {NSLog(@"============刪除cookie===============");NSHTTPCookieStorage *cookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage];NSArray *cookies = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies];//刪除cookiefor (NSHTTPCookie *tempCookie in cookies) {[cookieStorage deleteCookie:tempCookie];}//把cookie打印出來,檢測是否已經刪除NSArray *cookiesAfterDelete = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies];for (NSHTTPCookie *tempCookie in cookiesAfterDelete) {NSLog(@"cookieAfterDelete: %@", tempCookie);}NSLog(@"\n"); }

3,通過本地存儲的數據設置cookie
把本地的cookie取出并反歸檔,設置到cookie中,并且檢測cookie是否設置成功

#pragma mark 再取出保存的cookie重新設置cookie - (void)setCoookie {NSLog(@"============再取出保存的cookie重新設置cookie===============");//取出保存的cookieNSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];//對取出的cookie進行反歸檔處理NSArray *cookies = [NSKeyedUnarchiver unarchiveObjectWithData:[userDefaults objectForKey:@"cookie"]];if (cookies) {NSLog(@"有cookie");//設置cookieNSHTTPCookieStorage *cookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage];for (id cookie in cookies) {[cookieStorage setCookie:(NSHTTPCookie *)cookie];}}else{NSLog(@"無cookie");}//打印cookie,檢測是否成功設置了cookieNSArray *cookiesA = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies];for (NSHTTPCookie *cookie in cookiesA) {NSLog(@"setCookie: %@", cookie);}NSLog(@"\n"); }

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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。