首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSHTTPCookieStorage用于相同的URL但不同的用户

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

Stack Overflow用户
提问于 2016-06-02 16:23:45
回答 3查看 1.2K关注 0票数 1

也许这是一个愚蠢的问题,但我想存储相同的网址,但不同的用户名饼干。如何使用NSHTTPCookieStorage实现这一点?我就是这样从响应中存储曲奇的。

代码语言:javascript
复制
        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];
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-06-04 04:06:41

如果我正确地理解了您,您希望为不同的用户提供一组单独的cookie。如果是这样的话,那么你应该:

  1. 创建您自己的自定义cookie存储类(可能只是一个字典,以基URL作为键,cookie数组作为值),并在那里存储cookie,并使用sharedHTTPCookieStorage对象。
  2. 更改用户时,清除共享cookie存储并从新用户的cookie jar中复制cookie (或选择性地从共享jar中删除该用户创建的每个cookie)。

如果我误解了您,并且您想要将一个特定的cookie存储在共享cookie存储之外,原因如下:

  1. 基于具有nil的配置创建一个NSURLSession对象(禁用自动cookie存储)。
  2. 像上面那样将cookie存储到cookie jar中(这可能是共享的cookie jar,也可能不是共享的cookie jar),但是忽略那些想要避免存储的cookie。
  3. 编写一个方法,将cookie jar中的cookie添加到NSURLRequest对象中。
  4. 在使用URL请求对象创建任务之前,请始终记住对它们调用该方法。

当然,这都假定为NSURLSession。我不认为有一种方法可以用NSURLConnection控制cookie存储。所有cookie都存储在cookie jar中,句号是AFAIK。

票数 2
EN

Stack Overflow用户

发布于 2018-08-27 17:31:07

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

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

示例:

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

代码语言:javascript
复制
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存储。类似于:

代码语言:javascript
复制
// 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)
}
票数 1
EN

Stack Overflow用户

发布于 2019-03-05 10:53:10

代码语言:javascript
复制
@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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37597250

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档