NSHTTPCookie存储相同的URL但不同的用户

时间:2016-06-02 16:23:45

标签: ios nsurlsession nshttpcookie nshttpurlresponse nshttpcookiestorage

可能这是一个愚蠢的问题,但我想为同一个网址存储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];

3 个答案:

答案 0 :(得分:2)

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

  1. 创建您自己的自定义Cookie存储类(可能只是一个以基本URL作为键和一组Cookie作为值的字典),并在此处存储Cookie以及使用sharedHTTPCookieStorage对象。

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

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

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

    2. 将饼干存放在像上面那样的饼干罐中(可能是也可能不是共享的饼干罐),但要省去你想要避免存放的饼干。

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

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

    5. 当然,这都假定为NSURLSession。我不认为有办法用NSURLConnection控制cookie存储。所有cookie都存储在cookie jar,期间,AFAIK中。

答案 1 :(得分:0)

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

您可以使用该方法获得公用Cookie存储,并将其用于URLSession

示例:

NSHTTPCookieStorage用于相同的URL,但用户不同

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)
}

答案 2 :(得分:0)

@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