ios - WKWebview 注入(inject) cookie header 导致重定向循环

标签 ios swift redirect cookies wkwebview

我试图将我单独获取的 session cookie 注入(inject)到 WKWebview 请求中,结果证明这很痛苦......

我设法使用 this solution 注入(inject) session cookie ,如下:

// Acquiring the cookies
let cookies = HTTPCookie.cookies(withResponseHeaderFields: headers, for: s.request!.url!)

//Appending all the cookies into one raw string.
var cookiesRawString = ""
for c in cookies {
   cookiesRawString += "\(c.name)=\(c.value); "
}

var req: URLRequest = try! URLRequest(url: URL, method: method)

// Then the injection itself
request.setValue(cookiesRawString, forHTTPHeaderField: "Cookie")

webView.load(req)

让我用伪代码快速解释一下服务器逻辑:

  1. 服务器接收对端点 /endpoint1 的调用,并附加初始 session cookie
  2. 然后继续将客户端重定向到 /endpoint2,并在 url 中附加用户生成的 token 。
  3. 请求附加 token 的第二个端点导致最终重定向到 /endpoint3,其中包含一次性 session cookie 的 Set-Cookie header
  4. /endpoint3 附加一次性 session cookie 导致 200 响应,用户被识别。

问题是,出于某种原因,当我使用上述方法将 cookie 附加到初始请求时,会产生重定向循环,而在 Android 平台上它可以完美运行(我在那里使用了类似的注入(inject)方法)。

我看到它们之间的唯一区别是 android 应用仅在初始请求时注入(inject) cookie,并且所有后续重定向调用都没有这些 session cookie。 虽然 ios 在所有重定向调用上重复初始 session cookie(甚至忽略服务器 set-cookie header 并附加初始 session cookie..)。

我做错了什么吗?如何让 wkwebview 仅在初始请求时使用注入(inject)的 cookie?

编辑 1:也尝试回退到 UIWebview,但它产生相同的结果,似乎将 cookie 作为 header 注入(inject)并不好,但我尝试使用 HTTPCookieStorage,但它不会保存 cookie !

// the count is 7
var cookiesCount = HTTPCookieStorage.shared.cookies(for: s.request!.url!)?.count

let cookies = HTTPCookie.cookies(withResponseHeaderFields: headers, for: s.request!.url!)

for c in cookies {
   HTTPCookieStorage.shared.setCookie(c)
}

// Count is still 7!            
cookiesCount = HTTPCookieStorage.shared.cookies(for: s.request!.url!)?.count

编辑 2: 好吧,我发现 UIWebview 正在使用 cookie 存储的全局实例,与 alamofire(我用它来获取 session cookie)相同,因此无需手动添加 cookie,该站点识别了用户。

但我仍然更喜欢使用 WKWebview,因为 UIWebview 内存泄漏飞速上升(在几个网页导航后超过 100 mb!)。

有没有办法在WKWebview中使用全局cookie jar(alamofire使用的)??

最佳答案

我认为这可能无关,但我遇到了类似的问题。

原因是修改后的 cookie 弄乱了我使用 NSURL.sharedSession 的所有后续请求。事实证明,使用 WKWebView 设置的 cookie 正在清除 NSURLSession.sharedSession 中的 header 。我认为 cookie 存储在多个 session 之间共享。所以,我最终使用了 EphemeralSession,而不是 sharedSession。

关于ios - WKWebview 注入(inject) cookie header 导致重定向循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40177750/

相关文章:

iphone - 将浮点值从数组传递到坐标时出现异常

ios - 从Parse.com流音频-没有检索到数据?

ios - 如何确定应用程序是否已启动以进行后台获取

从命令行快速主运行/构建

ios - 解析仪表板设置

arrays - 如何在 Core Data 中存储一组自定义(和重复)对象?

javascript - 使用 jquery 单击按钮取消表单并重定向页面

PHP:登录后将用户返回到其原始页面

ios - 用于动画的 Sprite 表与 PNG 文件数组

.htaccess - 使用 htaccess 强制 SSL 和 WWW 一起使用