当使用代码302重定向时,WKWebView无法设置cookie
我发送请求到url1。 url1将使用cookie重定向到url2。 url2用于授权。 我得到代码“302 found”,这是正确的。 但是当url2重定向回url1时,cookie丢失了。 这导致我的请求保持重定向到url2,循环直到失败。
有没有人遇到过这种问题并且知道解决方案? 提前致谢。
这是一个WKWebView问题。 UIWebView可以正常工作。 但不知何故,我需要改为使用WKWebView。
我已经尝试了很多解决方案,例如我可以设置WKWebView使用的cookie吗? 。 这些方法可以处理同一域中的cookie。 我的问题是url1和url2有不同的域名。 重定向时,cookie丢失,导致授权失败,导致url1和url2之间的循环。
有没有人遇到这个问题并找到了解决方法? 提前致谢。
不幸的是,没有官方支持在WKWebView中处理302重定向响应。我也遇到了同样的问题。有一种方法可以解决但可能会冒一些风险而不是优雅。
- 覆盖
WKWebView.load(_ request: URLRequest)
并使用URLSession来发出请求。 - 确保你的URLSession可以自己处理302重定向,这意味着你需要实现
func urlSession(_ session: URLSession, task: URLSessionTask, willPerformHTTPRedirection response: HTTPURLResponse, newRequest request: URLRequest, completionHandler: @escaping (URLRequest?) -> Void)
指定您不希望URLSession自动处理302重定向。 - 一旦你使用
URLSession
得到302响应,附加的cookie将自动设置为HTTPCookieStorage.shared
然后使用这些cookie和响应头字段的url创建一个新请求由WKWebView
本身定位。
代码示例是Here .I子类WKWebView
并且在大多数情况下也处理cookie,包括你的302重定向情况。如果它适合你,请给我一个明星thx!
这是一种非常黑客的方式,如果你想在产品中使用它,要小心。
如果您需要来自’url2’的后续请求来设置其Cookie,您可以尝试使用’ WKUserScript
‘在文档启动时通过javascript以编程方式设置值,如下所示:
WKUserContentController* userContentController = WKUserContentController.new; WKUserScript * cookieScript = [[WKUserScript alloc] initWithSource: @"document.cookie = 'TeskCookieKey1=TeskCookieValue1';document.cookie = 'TeskCookieKey2=TeskCookieValue2';" injectionTime:WKUserScriptInjectionTimeAtDocumentStart forMainFrameOnly:NO]; // again, use stringWithFormat: in the above line to inject your values programmatically [userContentController addUserScript:cookieScript]; WKWebViewConfiguration* webViewConfig = WKWebViewConfiguration.new; webViewConfig.userContentController = userContentController; WKWebView * webView = [[WKWebView alloc] initWithFrame:CGRectMake(/*set your values*/) configuration:webViewConfig];
但是,如果您需要在初始加载请求中设置cookie,则可以在NSMutableURLRequest上设置它们,如下所示:
WKWebView * webView = /*initialization stuff*/ NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"YOUR URL"]]; [request addValue:@"TestCookieKey1=TestCookieValue1;TestCookieKey2=TestCookieValue2;" forHTTPHeaderField:@"Cookie"]; // use stringWithFormat: in the above line to inject your values programmatically [webView loadRequest:request];
您可以结合以上两种技术将Cookie值从Native环境传输到WebView环境。
您可以参考此链接以获取有关cookie的更多高级信息。
另一个解决方案对我有用:
采用WKNavigationDelegate
, WKNavigationDelegate
webView.navigationDelegate = self
,然后:
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) { /// Cancel the navigation action decisionHandler(.cancel) /// Navigate yourself let request = NSMutableURLRequest(url: url) request.allHTTPHeaderFields = HTTPCookie.requestHeaderFields(with: Auth.getAuthCookies()) webView.load(request as URLRequest) }
这就是我的简单案例所需要的全部内容,但我想其他人可能还需要复制存储在navigationAction.request
的其他请求信息,例如navigationAction.request.allHTTPHeaderFields
我想iOS 11的正确解决方案是使用WKHTTPCookieStore 。 根据本主题演讲,它旨在解决这个问题。