10

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

提前感谢您的任何想法。

4

3 回答 3

8

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

于 2015-12-09T13:46:14.163 回答
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,但我认为它不存在。

希望能帮助到你。

于 2015-03-02T21:46:44.813 回答
0

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

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

于 2015-02-25T12:17:18.703 回答