开发者社区 问答 正文

iOS WebView 中的 Cookie场景IP直连的几种方法(4)


iOS11 之前的处理方法:NSURLProtocal拦截后,手动管理 Cookie 的存储:


步骤:做 IP 替换时将原始 URL 保存到 Header 中

  1. + (NSURLRequest *)canonicalRequestForRequest:(NSURLRequest *)request {
  2.     NSMutableURLRequest *mutableReq = [request mutableCopy];
  3.     NSString *originalUrl = mutableReq.URL.absoluteString;
  4.     NSURL *url = [NSURL URLWithString:originalUrl];
  5.     // 异步接口获取IP地址
  6.     NSString *ip = [[HttpDnsService sharedInstance] getIpByHostAsync:url.host];
  7.     if (ip) {
  8.         NSRange hostFirstRange = [originalUrl rangeOfString:url.host];
  9.         if (NSNotFound != hostFirstRange.location) {
  10.             NSString *newUrl = [originalUrl stringByReplacingCharactersInRange:hostFirstRange withString:ip];
  11.             mutableReq.URL = [NSURL URLWithString:newUrl];
  12.             [mutableReq setValue:url.host forHTTPHeaderField:@"host"];
  13.             // 添加originalUrl保存原始URL
  14.             [mutableReq addValue:originalUrl forHTTPHeaderField:@"originalUrl"];
  15.         }
  16.     }
  17.     NSURLRequest *postRequestIncludeBody = [mutableReq cyl_getPostRequestIncludeBody];
  18.     return postRequestIncludeBody;
  19. }

然后获取到数据后,手动管理 Cookie:
  1. - (void)handleCookiesFromResponse:(NSURLResponse *)response {
  2.     NSString *originalURLString = [self.request valueForHTTPHeaderField:@"originalUrl"];
  3.     if ([response isKindOfClass:[NSHTTPURLResponse class]]) {
  4.         NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
  5.         NSDictionary<NSString *, NSString *> *allHeaderFields = httpResponse.allHeaderFields;
  6.         if (originalURLString && originalURLString.length > 0) {
  7.             NSArray *cookies = [NSHTTPCookie cookiesWithResponseHeaderFields:allHeaderFields forURL: [[NSURL alloc] initWithString:originalURLString]];
  8.             if (cookies && cookies.count > 0) {
  9.                 NSURL *originalURL = [NSURL URLWithString:originalURLString];
  10.                 [[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookies:cookies forURL:originalURL mainDocumentURL:nil];
  11.             }
  12.         }
  13.     }
  14. }
  15. - (void)task:(CFHTTPDNSRequestTask *)task didReceiveResponse:(NSURLResponse *)response cachePolicy:(NSURLCacheStoragePolicy)cachePolicy {
  16.     [self handleCookiesFromResponse:response];
  17.     [self.client URLProtocol:self didReceiveResponse:response cacheStoragePolicy:cachePolicy];
  18. }

发送请求前,向请求中添加Cookie信息:
  1. + (void)handleCookieWithRequest:(NSMutableURLRequest *)request {
  2.     NSString* originalURLString = [request valueForHTTPHeaderField:@"originalUrl"];
  3.     if (!originalURLString || originalURLString.length == 0) {
  4.         return;
  5.     }
  6.     NSArray *cookies = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies];
  7.     if (cookies && cookies.count >0) {
  8.         NSDictionary *cookieHeaders = [NSHTTPCookie requestHeaderFieldsWithCookies:cookies];
  9.         NSString *cookieString = [cookieHeaders objectForKey:@"Cookie"];
  10.         [request addValue:cookieString forHTTPHeaderField:@"Cookie"];
  11.     }
  12. }
  13. + (NSURLRequest *)canonicalRequestForRequest:(NSURLRequest *)request {
  14.     NSMutableURLRequest *mutableReq = [request mutableCopy];
  15. //...
  16.      [self handleCookieWithRequest:mutableReq];
  17.     return [mutableReq copy];
  18. }

展开
收起
猫饭先生 2017-10-20 11:21:42 1948 分享 版权
阿里云 AI 助理回答

在iOS 11之前,通过NSURLProtocol手动管理Cookie和处理URL请求的重定向或修改是一种常见的做法。您提供的代码片段展示了如何在自定义的NSURLProtocol子类中实现这一过程,主要涉及两个关键步骤:替换URL中的主机名(IP地址替换)以及手动处理响应中的Cookie。

IP替换与Header设置

您的代码首先在canonicalRequestForRequest:方法中对原始请求进行修改,这里进行了以下操作: - 获取原始请求的URL,并从中提取主机名。 - 使用异步接口getIpByHostAsync:获取该主机名对应的IP地址。 - 如果成功获取到IP地址,则将原始URL中的主机名替换为IP地址,并更新请求的URL。 - 为了确保请求能够正确路由,将替换前的主机名添加到请求的HTTP头字段"host"中。 - 同时,将原始URL保存到请求的另一个自定义HTTP头字段"originalUrl"中,以便后续处理使用。

手动管理Cookie

接下来,在handleCookiesFromResponse:方法中,您基于从响应中获取的信息来手动管理Cookie。具体步骤包括: - 首先,从原始请求中读取之前保存的"originalUrl",以确定应将Cookie关联到哪个原始域名。 - 然后,检查响应是否为NSHTTPURLResponse类型,如果是,则访问其所有头部字段。 - 接下来,理论上应该遍历这些头部字段,查找与Cookie相关的字段(如"Set-Cookie"),并根据需要存储或更新这些Cookie信息。不过,您提供的代码在这里似乎被截断了,没有展示具体的Cookie处理逻辑。

注意事项

  • 在实际应用中,手动管理Cookie可能涉及到解析"Set-Cookie"头部,提取Cookie值,并使用NSHTTPCookieStorage来保存或更新这些Cookie,确保它们能被后续的网络请求所使用。
  • 随着iOS版本的更新,特别是引入NSURLSession等更现代的网络请求API后,直接使用NSURLProtocol进行此类底层操作的需求已减少。现在更多推荐使用更高层次的网络库(如AFNetworking、Alamofire或直接使用NSURLSession)来处理网络请求及Cookie管理,这些库通常提供了更简洁、安全的API来处理复杂的网络需求。
  • 对于阿里云产品而言,如果您的应用部署在阿里云上,考虑利用云服务的优势,比如使用阿里云CDN、负载均衡SLB等服务,它们可以自动处理DNS解析、IP映射及优化网络性能,减轻客户端处理这些细节的负担。同时,对于App内需要的用户认证和会话管理,可以考虑结合阿里云的移动推送、统一身份认证等服务来提升用户体验和安全性。
有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答