使用 NSURLSession 设置 cookie

Posted

技术标签:

【中文标题】使用 NSURLSession 设置 cookie【英文标题】:Set cookies with NSURLSession 【发布时间】:2014-06-06 17:57:22 【问题描述】:

您好,我正在开发一个 Iphone 应用程序,我想在服务器响应后设置 cookie 并将其用于另一个请求。我的网络请求看起来像。

NSURLSession *session = [NSURLSession sharedSession];
[[session dataTaskWithURL:url completionHandler:^(NSData *data, NSURLResponse *response, NSError *error)

    NSHTTPURLResponse *httpResp = (NSHTTPURLResponse*) response;
    NSLog(@"sttaus code %i", httpResp.statusCode);
    if (error) 
        [self.delegate signinWithError:error];
    
    else 
        [self.delegate signinWithJson:data];
    
] resume];

但我不知道如何设置 cookie。我知道我必须使用NSHTTPCookieStorage,但我不知道如何设置。而且我还想将该 cookie 用于另一个请求。有没有人知道这件事?需要帮忙。谢谢。

看到我是这样尝试的

NSURLSession *session = [NSURLSession sharedSession];
[[session dataTaskWithURL:url completionHandler:^(NSData *data, NSURLResponse *response, NSError *error)
      
    if(error) 
        [self.delegate signinWithError:error];
    
    else 
        NSHTTPURLResponse *httpResp = (NSHTTPURLResponse*) response;

        [[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookieAcceptPolicy:NSHTTPCookieAcceptPolicyAlways];
        NSHTTPCookie *cookie;

        NSMutableDictionary *cookieProperties = [NSMutableDictionary dictionary];

        NSDictionary* headers = [(NSHTTPURLResponse *)response allHeaderFields];

        for(NSString *key in [headers allKeys]) 
            NSLog(@"%@ ..PPPP ... %@",key ,[headers objectForKey:key]);
            [cookieProperties setObject:[headers objectForKey:key] forKey:key];
        

        [cookieProperties setObject:[[NSDate date] dateByAddingTimeInterval:2629743] forKey:NSHTTPCookieExpires];

        cookie = [NSHTTPCookie cookieWithProperties:cookieProperties];
        [[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookie];

        [self.delegate signinWithJson:data];
    
] resume];

我只对一个标题字段Set-Cookie SSID=kgu62c0fops35n6qbf12anqlo7; path=/感兴趣

【问题讨论】:

【参考方案1】:

您可能只需将sharedHTTPCookieStorage 用于NSHTTPCookieStorage,然后使用setCookies:forURL:mainDocumentURL: 或单个setCookie: - 后者可能更适合您的需求。

如果这不起作用,您可能需要设置 NSURLSessionConfiguration 并设置 NSHTTPCookieStorage

文档没有说明,但defaultSessionConfiguration 可能会使用共享存储。

NSURLSession *session = [NSURLSession sharedSession];
[[session dataTaskWithURL:url completionHandler:^(NSData *data, NSURLResponse *response, NSError *error)

    NSHTTPURLResponse *httpResp = (NSHTTPURLResponse*) response;

    NSArray *cookies = [NSHTTPCookie cookiesWithResponseHeaderFields:[response allHeaderFields] forURL:[response URL]];
    [[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookies:cookies forURL:[response URL] mainDocumentURL:nil];

    NSLog(@"sttaus code %i", httpResp.statusCode);
    if (error) 
        [self.delegate signinWithError:error];
    
    else 
        [self.delegate signinWithJson:data];
    
] resume];

【讨论】:

我在登录请求后有标题字段。所以我有两种方法可以做到这一点,一种将我的会话 ID(或要求字段)添加到用户数据中或将其保存为 cookie。我决定使用cookies。但我不知道如何创建以及如何使用 NSURLSESSION 传递 cookie。 您能否发布标题字段 - 请随意删除重要数据 您在响应中有 cookie - 我以为您想在请求中设置它 :)。看到这是完整的场景。用户将登录到我的应用程序。登录后,我必须为该用户维护会话。因此,一旦用户登录,我正在做的事情就是将会话 ID 保存一段时间。因此,如果用户在我的应用程序中执行某些活动,我需要该会话 ID。否则服务器会给出 401 错误。因此,在登录任何请求后,我将传递该会话 ID 以在服务器端进行身份验证。这是正确的方法还是有更好的方法。很高兴接受更好的:) 任何使用 sharedSession 的请求都将使用共享 cookie 存储,因此它们将获取具有匹配域和路径的所有 cookie。【参考方案2】:

我进行了很多研究,但在另一种语言的网站上找到了一个。解决方案是为会话开始和结束添加一个空的事件处理程序:

protected void Session_Start(object sender, EventArgs e)


protected void Session_End(object sender, EventArgs e)


【讨论】:

我不知道你是在这里答错了问题还是什么,但这个答案与问题完全无关。

以上是关于使用 NSURLSession 设置 cookie的主要内容,如果未能解决你的问题,请参考以下文章

我可以在创建 NSURLSession 后更新其配置中的 cookie 吗?

iOS 10 beta NSURLSession 请求的 cookie 消失了

如何将 cookie 传递给 NSUrlSession?

尝试使用 NSURLSession 加载网页

NSURLSession dataTaskWithRequest 未被调用

ios学习笔记——NSURLSession