开发者社区 问答 正文

HTTPDNS域名解析场景下如何使用Cookie?(1)



1. Cookie


由于HTTP协议是无状态的,为了维护服务端和客户端的会话状态,客户端可存储服务端返回的Cookie,之后请求中可携带Cookie标识状态。
客户端根据服务端返回的携带Set-Cookie的HTTP Header来创建一个Cookie,Set-Cookie为字符串,主要字段如下:Set-Cookie: [name1=value1, name2=value2;], [expires=date;], [path=path;], [domain=domain;]

  • Cookie信息为形如name=value的字符串;
  • expires,Cookie过期时间;
  • domain,Cookie适用域名;
  • path,请求资源URL中必须存在指定的路径时,才会发送该Cookie。


2. Cookie存储策略

  • 基于iOS平台说明服务端Set-Cookie配置和客户端Cookie存储策略。


2.1 准备工作

  • 访问域名test.com,假定HTTPDNS域名解析结果为201.87.1.125;
  • Web服务器设置Cookie如下,domain字段待定:
" Set-Cookie " = "name1=value1; expires=Wed, 15-Nov-17 15:41:02 GMT; path=/"
  • 客户端发送普通HTTP请求:
- ( void)connectToUrlString:( NSString *)urlString { NSURL *url = [ NSURL URLWithString:urlString]; NSURLSessionConfiguration *configuration = [ NSURLSessionConfiguration defaultSessionConfiguration];configuration.requestCachePolicy = NSURLRequestReloadIgnoringLocalCacheData; NSURLSession *session = [ NSURLSession sessionWithConfiguration:configuration delegate: self delegateQueue: nil]; NSMutableURLRequest *request = [ NSMutableURLRequest requestWithURL:url]; NSURLSessionTask *task = [session dataTaskWithRequest:request completionHandler:^( NSData *data, NSURLResponse *response, NSError *error) { if (error) { NSLog( @"error: %@", error);} else { NSLog( @"response: %@", response); NSLog( @"data: %@", [[ NSString alloc] initWithData:data encoding: NSUTF8StringEncoding]);}}];[task resume];}
  • 客户端使用HTTPDNS服务发送HTTP请求:
- ( void)connectToUrlStringUsingHTTPDNS:( NSString *)urlString { NSURL *url = [ NSURL URLWithString:urlString]; NSURLSessionConfiguration *configuration = [ NSURLSessionConfiguration defaultSessionConfiguration];configuration.requestCachePolicy = NSURLRequestReloadIgnoringLocalCacheData; NSURLSession *session = [ NSURLSession sessionWithConfiguration:configuration delegate: self delegateQueue: nil]; NSMutableURLRequest *request = [ NSMutableURLRequest requestWithURL:url]; NSString *ip = [[HttpDnsService sharedInstance] getIpByHostAsync:url.host]; if (ip) { NSLog( @"Get IP(%@) for host(%@) from HTTPDNS Successfully!", ip, url.host); NSRange hostFirstRange = [urlString rangeOfString:url.host]; if (hostFirstRange.location != NSNotFound) { NSString * newUrlString = [urlString stringByReplacingCharactersInRange:hostFirstRange withString:ip];request.URL = [ NSURL URLWithString:newUrlString];[request setValue:url.host forHTTPHeaderField: @"host"];}} NSURLSessionTask *task = [session dataTaskWithRequest:request completionHandler:^( NSData *data, NSURLResponse *response, NSError *error) { if (error) { NSLog( @"error: %@", error);} else { NSLog( @"response: %@", response); NSLog( @"data: %@", [[ NSString alloc] initWithData:data encoding: NSUTF8StringEncoding]);}}];[task resume];}
  • 查询本App存储全部Cookie:
NSHTTPCookieStorage *cookieStorage = [ NSHTTPCookieStorage sharedHTTPCookieStorage]; for ( NSHTTPCookie *cookie in [cookieStorage cookies]) { NSLog( @"cookie: %@", cookie);}
  • 查询本App存储指定URL对应适配Cookie:
NSHTTPCookieStorage *cookieStorage = [ NSHTTPCookieStorage sharedHTTPCookieStorage]; NSDictionary *cookiesDic = [ NSHTTPCookie requestHeaderFieldsWithCookies:[cookieStorage cookiesForURL:url]];

2.2 指定domain的Cookie


服务端配置Set-Cookie如下,domain设置为.test.com," Set-Cookie " = "name1=value1; expires=Wed, 15-Nov-17 15:41:02 GMT; path=/; domain=.test.com"
客户端调用[self connectToUrlString:@"http://test.com"];发送HTTP请求后查询本地Cookie如下;再次访问时,HTTP头部自动添加该Cookie并发送到服务端。name1 = value1;expires = Wed, 15-Nov- 17 15: 41: 02 GMT;path = /;domain = .test.com;
客户端调用[self connectToUrlStringUsingHTTPDNS:@"http://test.com"];,使用HTTPDNS服务发送HTTP请求,客户端同样收到上述domain为.test.com的Cookie,iOS网络库关于Cookie的默认存储策略为NSHTTPCookieAcceptPolicyOnlyFromMainDocumentDomain,domain与URL无法匹配时(使用HTTPDNS服务发送HTTP请求时,原生URL.host被替换为IP地址),该Cookie不会存储,因此再次发送请求时无法使用Cookie。

2.3 未指定domain的Cookie


若服务端配置Set-Cookie的domain不配置," Set-Cookie " = "name1=value1; expires=Wed, 15-Nov-17 15:41:02 GMT; path=/;
客户端发送HTTP请求返回Cookie如下,domain字段为空。name1 = value1;expires = Wed, 15-Nov- 17 15: 41: 02 GMT;path = /;
iOS网络库存储该Cookie时,自动填充Cookie的domain字段为HTTP请求的URL.host,即普通HTTP请求存储Cookie如下:name1 = value1;expires = Wed, 15-Nov- 17 15: 41: 02 GMT;path = /;domain = .test.com;
使用HTTPDNS访问的Cookie存储如下,再次使用HTTPDNS进行HTTP请求时,网络库默认Cookie匹配规则可以匹配到该Cookie。(此场景下使用HTTPDNS服务发送HTTP请求,虽然默认Cookie匹配规则可正确匹配Cookie,但是该场景依赖服务端Cookie的配置,为了安全性,通常服务端返回Set-Cookie的domain字段不为空。)name1 = value1;expires = Wed, 15-Nov- 17 15: 41: 02 GMT;path = /;domain = 201.87. 1.125;

展开
收起
猫饭先生 2017-10-20 11:14:03 2450 分享 版权
0 条回答
写回答
取消 提交回答