NSHTTPCookieStorage

 cookie机制采用的是在客户端保持 HTTP 状态信息的方案 

借鉴如下其他网络资源:

(1)Cookie是在浏览器访问WEB服务器的某个资源时,由WEB服务器在HTTP响应消息头中附带传送给浏览器的一个小文本文件。 
一旦WEB浏览器保存了某个Cookie,那么它在以后每次访问该WEB服务器时,都会在HTTP请求头中将这个Cookie回传给WEB服务器。 
底层的实现原理: WEB服务器通过在HTTP响应消息中增加Set-Cookie响应头字段将Cookie信息发送给浏览器,浏览器则通过在HTTP请求消息中增加Cookie请求头字段将Cookie回传给WEB服务器。 
一个Cookie只能标识一种信息,它至少含有一个标识该信息的名称(NAME)和设置值(VALUE)。 
一个WEB站点可以给一个WEB浏览器发送多个Cookie,一个WEB浏览器也可以存储多个WEB站点提供的Cookie。 
浏览器一般只允许存放300个Cookie,每个站点最多存放20个Cookie,每个Cookie的大小限制为4KB

(2)一 直以为ios的http请求这块很简单应该不支持记录,保存,或者使用cookie,可是想当然归想当然,真用的时候,真研究了一下发现还真强大。经过一 番的研究简单说一下我的理解:当你访问一个网站时,不管你愿意或者不愿意,NSURLRequest都会帮你主动记录下来你访问的站点设置的 cookie,而且很负责任的,当你下次再访问这个站点时,NSURLRequest会拿着上次保存下来了的cookie继续去请求。这规律同样适用于 ASIHTTPRequest。所以当你做一些基于认证的网络请求时,cookie不失为一个完美的解决方案。

(3)当你访问一个网站时,NSURLRequest都会帮你主动记录下来你访问的站点设置的cookie,如果 Cookie 存在的话,会把这些信息放在 NSHTTPCookieStorage 容器中共享,当你下次再访问这个站点时,NSURLRequest会拿着上次保存下来了的cookie继续去请求。
同样适用于ASIHTTPRequest,AFNetworking, Webview等,cookie常用于一些基于认证的网络请求


总结一句话: 如果你设置了NSHTTPCookieStorage 应用内所有的http请求   HTTP header自动添加了  set-cookie字段 。NSHTTPCookieStorage是单例。



如何设置才能让整个应用都享用此设置尼,

在iOS中:

NSHTTPCookieStorage 实现了一个管理cookie的单例对象(只有一个实例),每个cookie都是NSHTTPCookie类的实例,最为一个规则,cookie在所有应用之间共享并在不同进程之间保持同步。Session cookie(一个isSessionOnly方法返回YES的cookie)只能在单一进程中使用。



ios htttp网络请求cookie的读取与写入:

原生NSURLConnection写法
一.获取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写法

//获取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);
}

清空cookie
NSHTTPCookieStorage 
*cookieJar = [NSHTTPCookieStorage sharedHTTPCookieStorage];

NSArray*cookieArray = [NSArray arrayWithArray:[cookieJar cookies]];
  for(id obj in cookieArray)
{
    [cookieJar deleteCookie:obj];
}

手动设置cookie

第一次请求手动设置个cookie


    NSMutableURLRequest*request = [NSMutableURLRequest requestWithURL:url];

    NSMutableDictionary*cookieProperties = [NSMutableDictionary dictionary];
    [cookieProperties setObject:@"username" forKey:NSHTTPCookieName];

    [cookieProperties setObject:@"myios 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];

    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];
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值