1. 程式人生 > >iOS HTTP網路請求Cookie的讀取與寫入(NSHTTPCookieStorage)

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