用于相同URL但不同用户的NSHTTPCookies存储



这可能是一个愚蠢的问题,但我想为相同的url存储cookie,但为用户名存储不同的cookie。如何使用NSHTTPCookieStorage实现这一点?这就是我存储响应cookie的方式。

NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
NSDictionary *headerFields = [httpResponse allHeaderFields];

NSArray* cookies = [NSHTTPCookie
cookiesWithResponseHeaderFields:headerFields
forURL:[NSURL URLWithString:@""]];
for (NSHTTPCookie *cookie in cookies) {
[[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookie];
}
NSString *urlString = ...;
[[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookies:cookies forURL:[NSURL URLWithString:urlString] mainDocumentURL:nil];

如果我理解正确,您希望为不同的用户提供单独的cookie集。如果是,那么您应该:

  1. 创建您自己的自定义cookie存储类(可能只是一个以基本URL为键、以cookie数组为值的字典),并在其中存储cookie,此外还使用sharedHTTPCookieStorage对象。

  2. 当您更改用户时,请擦除共享cookie存储并从新用户的cookie罐中复制cookie(或选择性地从共享罐中删除该用户创建的每个cookie)。

如果我误解了你,你出于某种原因想在共享cookie存储之外存储一个特定的cookie:

  1. 使用nil cookie jar(禁用自动cookie存储)根据配置创建NSURLSession对象。

  2. 像上面所做的那样,将cookie存储到cookie罐中(可能是共享cookie罐,也可能不是共享cookie罐),但不要存储那些你想避免存储的cookie。

  3. 编写一个方法,将该cookie jar中的cookie添加到NSURLRequest对象中。

  4. 在使用URL请求对象创建任务之前,请始终记住对其调用该方法。

当然,这一切都假设NSURLSession。我认为没有一种方法可以通过NSURLConnection控制cookie存储。所有cookie都存储在cookie罐中,句号,AFAIK。

您可以使用sharedCookieStorage(forGroupContainerIdentifier:)为同一URL拥有单独的cookie存储(即多个用户)。

您可以通过使用该方法获得通用cookie存储,并在URLSession中使用它。

示例:

用于相同URL但不同用户的NSHTTPCookies存储

let configuration = URLSessionConfiguration.default.copy() as! URLSessionConfiguration
configuration.httpCookieStorage = HTTPCookieStorage.sharedCookieStorage(forGroupContainerIdentifier: UUID().uuidString)
configuration.httpCookieStorage?.cookieAcceptPolicy = .always
let sessionForCurrentUser = URLSession(configuration: configuration)
let task = sessionForCurrentUser.dataTask(with: URL(string: "https://foo.com/feature")!)
// ...

因此,如果要支持多个用户,请为每个用户创建一个通用组标识符。

如果应用程序从访客用户开始,那么当用户登录时,你需要"升级"cookie存储

// Upgrade from Guest user to Paid user
let guestCookieStorage = HTTPCookieStorage.sharedCookieStorage(forGroupContainerIdentifier: guestId)
let userCookieStorage = HTTPCookieStorage.sharedCookieStorage(forGroupContainerIdentifier: user.uniqueIdentifier)
for cookie in guestCookieStorage.cookies ?? [] {
userCookieStorage.setCookie(cookie)
}
@interface NSHTTPCookieStorage (ApplePrivateHeader)
-(id)_initWithIdentifier:(id)arg1 private:(BOOL)arg2;
@end
@interface User()
@property (nonatomic, strong) NSHTTPCookieStorage *myHTTPCookieStorage;
@end
@implementation User
-(instancetype)init
{
self = [super init];
if (self) {
//the [NSHTTPCookieStorage init] will generate a instance with no inner `NSHTTPCookieStorageInternal`, so.
_myHTTPCookieStorage = [[NSHTTPCookieStorage alloc] _initWithIdentifier: @"user_id_xxx" private:0];
_myHTTPCookieStorage.cookieAcceptPolicy = NSHTTPCookieAcceptPolicyAlways;
}
return self;
}
-(void)httpTask{
NSURLSessionConfiguration *c =[NSURLSessionConfiguration ephemeralSessionConfiguration];
c.HTTPCookieStorage = _myHTTPCookieStorage;
[[[NSURLSession sessionWithConfiguration: c] dataTaskWithRequest:request completionHandler:nil] resume];
}

// load from file
-(void)(id)initWithCoder:(NSCoder *)aDecoder{
NSArray<NSHTTPCookie*> *cookies = [aDecoder decodeObjectForKey:@"cookies"];
for (NSHTTPCookie *cookie in cookies) {
[_myHTTPCookieStorage setCookie: cookie];
}
}
//save to file
- (void)encodeWithCoder:(NSCoder *)aCoder
[aCoder encodeObject:_myHTTPCookieStorage.cookies forKey: @"cookies"];
}

@end

相关内容

  • 没有找到相关文章

最新更新