【问题标题】:Losing cookies in WKWebView在 WKWebView 中丢失 cookie
【发布时间】:2015-01-18 12:30:33
【问题描述】:

当我使用身份验证 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 缺少提到的here 的功能。

提前感谢您的任何想法。

【问题讨论】:

标签: cookies nsmutableurlrequest wkwebview


【解决方案1】:

最好的办法是将你的 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 并将其包含到您的请求中

【讨论】:

  • WKWebViews 的 loadRequest 返回 WKNavigation* 而不是 void:[developer.apple.com/reference/webkit/wkwebview/…
  • 您评论说:“那么每次您要加载请求时,请改为调用此函数:- (**void**)loadRequest:(NSURLRequest \*)request”。 WKWebView 的 loadRequest 返回 **WKNavigation* ** 而不是 ** void ** 。您写的内容与 UIWebViews 完美配合,但开头的问题提到了 WKWebViews。
  • 它确实有效(我在 UIWebview/WkWebview 的包装器中使用它)。它加载了请求,但我们只是不使用结果
  • 我需要帮助@TheWindwaker
  • ?我在这里没有看到您的问题
【解决方案2】:

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

  1. 在第一个请求中发送 cookie
  2. 让服务器在“Set-Cookie”标头中发回
  3. 每个后续请求都应该有 cookie

我还没有尝试过这种方法,但如果它不起作用,我会感到非常惊讶。

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

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

希望对你有帮助。

【讨论】:

  • 嗨亚历克斯,你知道这里有什么变化吗? cookie 在 WKWebView 中处理得更好吗?
  • 嗨 JLaw,看看这里developer.apple.com/library/prerelease/ios/releasenotes/General/… 我认为他们提供了在 iOS9 中处理 cookie 的好方法,虽然我自己没有尝试过
  • 这很棒,正是我的 Node.js 自定义服务器所需要的。不敢相信我没有想到。我正在对 cookie 的摄取过程进行反向建模。当然,服务器需要发送 Set-Cookie 以使 WKWebView 将其集成回其内部(不透明!?!Argh)cookie 存储。当 WKWebView 在 loadRequest 中包含它时,它是一个任意的 sent 标头。默认情况下,Web 服务器不需要回显“设置 Cookie”——它正确地假设浏览器已经拥有它。
【解决方案3】:

您可以在我们的视图中注入一些 javascript 来加载 cookie,这样由 web 视图发起的请求也将包含您的 cookie。有关详细信息,请参阅此问题的答案:

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

【讨论】:

    猜你喜欢
    • 2017-04-02
    • 1970-01-01
    • 2013-09-07
    • 1970-01-01
    • 2011-07-20
    • 1970-01-01
    • 1970-01-01
    • 2021-01-08
    • 1970-01-01
    相关资源
    最近更新 更多