【问题标题】:Set cookies with NSURLSession使用 NSURLSession 设置 cookie
【发布时间】: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=/感兴趣

【问题讨论】:

    标签: ios session-cookies nsurlsession


    【解决方案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)
    {
    }
    

    【讨论】:

    • 我不知道你是在这里答错了问题还是什么,但这个答案与问题完全无关。
    猜你喜欢
    • 2016-12-10
    • 1970-01-01
    • 2015-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多