zoukankan      html  css  js  c++  java
  • iOS htttp网络请求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写法

    2.AFNetworking 写法

    复制代码
    [[APIClient sharedClient] postPath:@"http://api.skyfox.org/api-test.php" parameters:p success:^(AFHTTPRequestOperation *operation, id JSON) {
            NSDictionary *fields = [operation.response allHeaderFields]; //afnetworking写法
            NSLog(@"fields = %@",[fields description]);
            NSURL *url = [NSURL URLWithString:@"http://api.skyfox.org/api-test.php"];
            //获取cookie方法1
             NSArray *cookies = [NSHTTPCookie cookiesWithResponseHeaderFields:fields forURL:url];
            //获取cookie方法2
            //NSString *cookieString = [[HTTPResponse allHeaderFields] valueForKey:@"Set-Cookie"];
     
        } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
          
        }];
    复制代码

    二.清空Cookie 

    三.手动设置Cookie 手动设置的Cookie不会自动持久化到沙盒

    复制代码
    第一次请求手动设置个cookie
    -(void)test1:(NSString*)urlString{
        NSURL *url = [NSURL URLWithString:@"http://api.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:@"api.skyfox.org" forKey:NSHTTPCookieDomain];
        [cookieProperties setObject:@"api.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://api.skyfox.org/cookie.php"];
        NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
        [self.mywebview2 loadRequest:request];
    }
    复制代码

    request还可以这样设置个Cookie

    四.Cookie的本地缓存策略

    五.Cookie的持久化存储

    1.服务器端设置Cookie,以PHP为例

    语法

    参数描述
    name 必需。规定 cookie 的名称。
    value 必需。规定 cookie 的值。
    expire 可选。规定 cookie 的有效期。
    path 可选。规定 cookie 的服务器路径。
    domain 可选。规定 cookie 的域名。
    secure 可选。规定是否通过安全的 HTTPS 连接来传输 cookie。

    如果服务器设置了Cookie失效时间expiresDate ,sessionOnly:FALSE会被持久化到文件中,kill掉后系统自动保存,下次启动app会自动加载.binarycookies中的Cookies,以下是一条Cookie输出

    持久化到了文件中,地址是 沙盒的 /Library/Cookies/org.skyfox.AFNetworking-demo.binarycookies

    ios app cookie存储目录

    使用BinaryCookieReader.py脚本 解析 org.skyfox.AFNetworking-demo.binarycookies 结果如下

    64146D7E-45E9-475D-9D5B-3DF6D9DB58E1

    2.app端手动存储Cookie

    如果没设置Cookie失效时间expiresDate:(null),sessionOnly:true,kill掉后系统不会自动保存Cookie,如果想持久化Cookie 模仿浏览器存住Cookie,使用NSUserDefaults存下即可,以下是一条Cookie输出

    手动保存

    复制代码
    //合适的时机保存Cookie
    - (void)saveCookies{
        NSData *cookiesData = [NSKeyedArchiver archivedDataWithRootObject: [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies]];
        NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
        [defaults setObject: cookiesData forKey: @"org.skyfox.cookie"];
        [defaults synchronize];
    }
    
    //合适的时机加载Cookie 一般都是app刚刚启动的时候
    - (void)loadCookies{
        NSArray *cookies = [NSKeyedUnarchiver unarchiveObjectWithData: [[NSUserDefaults standardUserDefaults] objectForKey: @"org.skyfox.cookie"]];
        NSHTTPCookieStorage *cookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
        for (NSHTTPCookie *cookie in cookies){
            [cookieStorage setCookie: cookie];
        }
    }
    复制代码
  • 相关阅读:
    转贴"三个月内通过Adsense赚一百万美金"
    今天申请了Google Adsense
    Asp.Net Core 多样性的配置来源
    Identity第二章
    Identity第一章
    Identity第三章 Authorize原理解析
    async和await
    ASP.Net Core简介
    【学习笔记】后缀数组 SA
    题解 [NOI2009] 植物大战僵尸
  • 原文地址:https://www.cnblogs.com/somebodywx/p/8929609.html
Copyright © 2011-2022 走看看