借鉴如下其他网络资源:
(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];
}