iOS HTTP網路請求Cookie的讀取與寫入(NSHTTPCookieStorage)
當你訪問一個網站時,NSURLRequest都會幫你主動記錄下來你訪問的站點設定的Cookie,如果 Cookie 存在的話,會把這些資訊放在 NSHTTPCookieStorage 容器中共享,當你下次再訪問這個站點時,NSURLRequest會拿著上次儲存下來了的Cookie繼續去請求。
同樣適用於ASIHTTPRequest,AFNetworking, Webview等,Cookie常用於一些基於認證的網路請求
認識下NSHTTPCookieStorage
NSHTTPCookieStorage 實現了一個管理cookie的單例物件(只有一個例項),每個Cookie都是NSHTTPCookie類的例項,最為一個規則,Cookie在所有應用之間共享並在不同程序之間保持同步。Session Cookie(一個isSessionOnly方法返回YES的Cookie)只能在單一程序中使用。
Cookie
Cookie是由伺服器端生成,傳送給User-Agent(一般是瀏覽器或者客戶端),瀏覽器會將Cookie的key/value儲存到某個目錄下的文字檔案內,下次請求同一網站地址時就傳送該Cookie給伺服器
HTTP header
HTTP header中包含HTTP請求與響應的操作引數. header屬性定義了所傳輸資料的各種特性. header屬性以屬性名開始,以冒號結尾,最後是屬性值.屬性名及值會因應用的不同
一.iOS htttp網路請求Cookie的讀取與寫入:
Cookie必然會通過HTTP的Respone傳過來,並且Cookie在Respone中的HTTP header中。不管是什麼請求框架,必然會存在Respone物件,比如AFNetworking2.x的operation.response,AFNetworking3.x的task.response等等。。。。
1.原生NSURLConnection寫法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | 一 .獲取 cookie - ( IBAction ) cookieTouched : ( id ) sender { NSURL *url = [ NSURL URLWithString : @"http://api.skyfox.org/api-test.php" ] ; NSURLRequest *request = [ NSURLRequest requestWithURL :url ] cachePolicy :NSURLRequestReloadIgnoringLocalAndRemoteCacheData timeoutInterval : 3 ] ; NSOperationQueue *queue = [ [ NSOperationQueue alloc ] init ] ; [ NSURLConnection sendAsynchronousRequest :request queue :queue completionHandler : ^ ( NSURLResponse *response , NSData *data , NSError *error ) { //轉換NSURLResponse成為HTTPResponse NSHTTPURLResponse *HTTPResponse = ( NSHTTPURLResponse * ) response ; //獲取headerfields NSDictionary *fields = [ HTTPResponse allHeaderFields ] ; //原生NSURLConnection寫法 // NSDictionary *fields = [operation.response allHeaderFields]; //afnetworking寫法 NSLog ( @"fields = %@" , [ fields description ] ) ; //獲取cookie方法1 // NSArray *cookies = [NSHTTPCookie cookiesWithResponseHeaderFields:fields forURL:url]; //獲取cookie方法2 //NSString *cookieString = [[HTTPResponse allHeaderFields] valueForKey:@"Set-Cookie"]; //獲取cookie方法3 NSHTTPCookieStorage *cookieJar = [ NSHTTPCookieStorage sharedHTTPCookieStorage ] ; for ( NSHTTPCookie *cookie in [ cookieJar cookies ] ) { NSLog ( @"cookie%@" , cookie ) ; } } ] ; } |
2.AFNetworking 寫法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | AFHTTPSessionManager *manager = [ AFHTTPSessionManager manager ] ; manager . responseSerializer = [ AFCompoundResponseSerializer serializer ] ; //demo中的api返回的是html資料,不是json [ manager POST : @"http://dev.skyfox.org/cookie.php" parameters :nil progress : ^ ( NSProgress * _Nonnull uploadProgress ) { } success : ^ ( NSURLSessionDataTask * _Nonnull task , id _Nullable responseObject ) { NSLog ( @"\n======================================\n" ) ; NSDictionary *fields = ( ( NSHTTPURLResponse * ) task . response ) . allHeaderFields ; NSLog ( @"fields = %@" , [ fields description ] ) ; NSURL *url = [ NSURL URLWithString : @"http://dev.skyfox.org/cookie.php" ] ; NSLog ( @"\n======================================\n" ) ; //獲取cookie方法1 NSArray *cookies = [ NSHTTPCookie cookiesWithResponseHeaderFields :fields forURL :url ] ; for ( NSHTTPCookie *cookie in cookies ) { NSLog ( @"cookie,name:= %@,valuie = %@" , cookie . name , cookie . value ) ; } NSLog ( @"\n======================================\n" ) ; // //獲取cookie方法2 // NSString *cookies2 = [((NSHTTPURLResponse*)task.response) valueForKey:@"Set-Cookie"]; // NSLog(@"cookies2 = %@",[cookies2 description]); } failure : ^ ( NSURLSessionDataTask * _Nullable task , NSError * _Nonnull error ) { } ] ; |
二.清空Cookie
1 2 3 4 5 | NSHTTPCookieStorage *cookieJar = [ NSHTTPCookieStorage sharedHTTPCookieStorage ] ; NSArray *cookieArray = [ NSArray arrayWithArray : [ cookieJar cookies ] ] ; for ( NSHTTPCookie *obj in cookieArray ) { [ cookieJar deleteCookie :obj ] ; } |
三.手動設定Cookie 手動設定的Cookie不會自動持久化到沙盒
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | 第一次請求手動設定個 cookie - ( void ) test1 : ( NSString * ) urlString { NSURL *url = [ NSURL URLWithString : @"http://dev.skyfox.org/cookie.php" ] ; NSMutableURLRequest *request = [ NSMutableURLRequest requestWithURL :url ] ; NSMutableDictionary *cookieProperties = [ NSMutableDictionary dictionary ] ; [ cookieProperties setObject : @"username" forKey :NSHTTPCookieName ] ; [ cookieProperties setObject : @"my ios cookie" forKey :NSHTTPCookieValue ] ; [ cookieProperties setObject : @"dev.skyfox.org" forKey :NSHTTPCookieDomain ] ; [ cookieProperties setObject : @"dev.skyfox.org" forKey :NSHTTPCookieOriginURL ] ; [ cookieProperties setObject : @"/" forKey :NSHTTPCookiePath ] ; [ cookieProperties setObject : @"0" forKey :NSHTTPCookieVersion ] ; [ cookieProperties setObject : [ NSDate dateWithTimeIntervalSinceNow : 60 * 60 ] forKey :NSHTTPCookieExpires ] ; //設定失效時間 [ cookieProperties setObject : @"0" forKey :NSHTTPCookieDiscard ] ; //設定sessionOnly NSHTTPCookie *cookie = [ NSHTTPCookie cookieWithProperties :cookieProperties ] ; [ [ NSHTTPCookieStorage sharedHTTPCookieStorage ] setCookie :cookie ] ; [ self . myWebView loadRequest :request ] ; } //第二次請求會自動帶上Cookie - ( IBAction ) test2 : ( id ) sender { NSURL *url = [ NSURL URLWithString : @"http://dev.skyfox.org/cookie.php" ] ; NSMutableURLRequest *request = [ NSMutableURLRequest requestWithURL :url ] ; [ self . mywebview2 loadRequest :request ] ; } |
request還可以這樣設定個Cookie
1 2 | [ request setHTTPShouldHandleCookies :YES ] ; [ request setValue : [ NSString stringWithFormat : @"%@=%@" , [ cookie name ] , [ cookie value ] ] forHTTPHeaderField : @"Cookie" ] ; |
四.Cookie的本地快取策略
1 2 3 |