NSMutableURLRequest 设置cookie 及 NSHTTPCookieStorage机制

Cookie
Cookie是由服务器端生成,发送给User-Agent(一般是浏览器或者客户端),浏览器会将Cookie的key/value保存到某个目录下的文本文件内,下次请求同一网站地址时就发送该Cookie给服务器在使用UIWebView访问网站时,经常遇到的一个问题是需要登录。比如访问新浪微博,或者访问某个个人账号,但是需要直接访问url,却会被重定向到登录页进行登录。那么真正的浏览器是如何做到的直接登录?一般来说,答案都是cookies。在你第一次登录时,网站设置了cookie,浏览器保存这些携带了登录信息的cookies,以后就可以直接登录。所以我们要做的就是在url request中带上cookies。

HTTP header
HTTP header中包含HTTP请求与响应的操作参数. header属性定义了所传输数据的各种特性. header属性以属性名开始,以冒号结尾,最后是属性值.属性名及值会因应用的不同

手动设置cookie值
NSMutableURLRequest设置Cookie值,一般必须包含以下几项:NSHTTPCookieValue, NSHTTPCookieName, NSHTTPCookiePath, NSHTTPCookieDomain。NSMutableURLRequest中提供了- (void)setValue:(NSString *)value forHTTPHeaderField:(NSString *)field 方法。同样的方法,还可以设置很多http header中的field。
NSDictionary *dictCookieUId = [NSDictionary dictionaryWithObjectsAndKeys:@"userId", NSHTTPCookieName,userId, NSHTTPCookieValue,
@"/", NSHTTPCookiePath,
@"test.com", NSHTTPCookieDomain,nil];//生成cookie的方法是先将cookie的各个property作为键值对生成dictionary

NSHTTPCookie *cookieUserId = [NSHTTPCookie cookieWithProperties:dictCookieUId];//调用cookieWIthProperties生成cookie
NSDictionary *dictCookiePToken = [NSDictionary dictionaryWithObjectsAndKeys:@"token", NSHTTPCookieName,
token, NSHTTPCookieValue,
@"/", NSHTTPCookiePath,
@"test.com", NSHTTPCookieDomain,nil];

NSHTTPCookie *cookiePassToken = [NSHTTPCookie cookieWithProperties:dictCookiePToken];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURLURLWithString:strUrl]];
NSArray *arrCookies = [NSArray arrayWithObjects: cookieUserId, cookiePassToken, nil];
NSDictionary *dictCookies = [NSHTTPCookie requestHeaderFieldsWithCookies:arrCookies];//将cookie设置到头中
[request setValue: [dictCookies objectForKey:@"Cookie"] forHTTPHeaderField: @"Cookie"];

NSMutableURLRequest连接中设置其他参数(采用JSON方式)
[request setHTTPMethod:@"POST"];
NSMutableArray *arrayData = [[NSMutableArray alloc] init];
NSMutableDictionary *dlist = [[NSMutableDictionary alloc] init];
[dlist setObject:@"trea" forKey:@"tableName"];
[dlist setObject:@"2016-04-05 11:20:00" forKey:@"latestDate"];
[arrayData addObject:dlist];
NSString *httpBodyString = [arrayData JSONRepresentation];
NSData *postData = [httpBodyString dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES]; 
[request setHTTPBody:postData];
return request;

发送连接请求
NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
if (responseData) {
   NSString *responseString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];
   NSMutableDictionary *dgetData = [responseString JSONValue];//json解析
}

苹果自动存储cookie机制: NSHTTPCookieStorage
因为NSHTTPCookieStorage的默认策略是: NSHTTPCookieAcceptPolicyAlways。当你访问一个网站时,NSURLRequest都会帮你主动记录下来你访问的站点设置的cookie,如果 Cookie 存在的话,会把这些信息放在 NSHTTPCookieStorage 容器中共享,
当你下次再访问这个站点时,NSURLRequest会拿着上次保存下来了的cookie继续去请求。
同样适用于ASIHTTPRequest,AFNetworking, Webview等,cookie常用于一些基于认证的网络请求
NSHTTPCookieStorage 实现了一个管理cookie的单例对象(只有一个实例),每个cookie都是NSHTTPCookie类的实例,最为一个规则,cookie在所有应用之间共享并在不同进程之间保持同步。
Session cookie(一个isSessionOnly方法返回YES的cookie)只能在单一进程中使用。

一次网络请求后,可获取对应返回的cookies
//获取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中,那么下次请求会自动带上相应cookies。
NSHTTPCookie *cookiePassToken = ...;
[[NSHTTPCookieStorage sharedHTTPCookieStorage]setCookie:cookiePassToken];//上面NSHTTPCookie

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

cookie 归档化存储
通过以下方法保存cookie,即可实现在退出程序,下一次进入的时候不用登录而再次使用cookie

//将cookie存储到:NSUserDefaults
NSArray *cookies = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookiesForURL: [NSURL URLWithString:kServerAddress]];  
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:cookies];  
[[NSUserDefaults standardUserDefaults] setObject:data forKey:kUserDefaultsCookie]; 

//将NSUserDefaults 中的cookie信息 存储到NSHTTPCookieStorage
NSData *cookiesdata = [[NSUserDefaults standardUserDefaults] objectForKey:kUserDefaultsCookie];  
if([cookiesdata length]) {  
    NSArray *cookies = [NSKeyedUnarchiver unarchiveObjectWithData:cookiesdata]; 
    NSHTTPCookie *cookie;  
    for (cookie in cookies) {  
        [[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookie];  
    }  
}  

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值