在WKWebView中丢失cookie

时间:2014-11-20 15:19:30

标签: cookies nsmutableurlrequest wkwebview

当我使用身份验证Cookie创建WKWebView的新请求并发送请求时,WKWebView正确加载受保护的网页:

let req = NSMutableURLRequest(URL: NSURL(string: urlPath)!)
let headers = NSHTTPCookie.requestHeaderFieldsWithCookies([myAuthCookie]);
req.allHTTPHeaderFields = headers;
webView.loadRequest(req)

问题是,当用户点击网页中的任何链接时,新请求WKWebView会丢失身份验证Cookie并重定向到登录页面。 Cookie域和路径已填写且正确无误。

我知道提到的WKWebView {{1}}缺少功能。

提前感谢任何想法。

3 个答案:

答案 0 :(得分:6)

最好的办法是将您的cookie存储到

[NSHTTPCookieStorage sharedHTTPCookieStorage]

然后,每次要加载请求时,请改为调用此函数:

- (void)loadRequest:(NSURLRequest *)request {
        if (request.URL) {
            NSDictionary *cookies = [NSHTTPCookie requestHeaderFieldsWithCookies:[[NSHTTPCookieStorage sharedHTTPCookieStorage] cookiesForURL:request.URL]];
            if ([cookies objectForKey:@"Cookie"]) {
                NSMutableURLRequest *mutableRequest = request.mutableCopy;
                [mutableRequest addValue:cookies[@"Cookie"] forHTTPHeaderField:@"Cookie"];
                request = mutableRequest;
            }
        }

        [_wkWebView loadRequest:request];
}

它从共享Cookie中提取正确的Cookie并将其包含在您的请求中

答案 1 :(得分:2)

我想当你在请求中设置它时,你将cookie发送到服务器但不在WKWebview中设置它。 Cookie通常由服务器在“Set-Cookie”标头中设置,然后应该保留。因此,如果您没有将cookie一直传递到服务器并返回的问题,那么您可以做一个技巧:

  1. 在第一个请求中发送cookie
  2. 让服务器在“Set-Cookie”标题
  3. 中将其发回
  4. 每个后续请求都应该有cookie
  5. 我还没有尝试过这种方法,但如果它不起作用将会非常惊讶。

    Sebastien提到的替代品可以通过javascript注入它。请注意,您不能以这种方式设置“HTTP-Only”标记,并且所有运行的脚本(https://www.owasp.org/index.php/HttpOnly)都可以使用cookie。

    我仍在尝试找到一种自然的方法来设置cookie,但我认为它不存在。

    希望它有所帮助。

答案 2 :(得分:0)

您可以在我们的视图中注入一些javascript来加载Cookie,以便网络视图发起的请求也会包含您的Cookie。有关详细信息,请参阅此问题的答案:

https://stackoverflow.com/a/26577303/251687