在 XMLHttpRequests 和 cordova 插件之间共享 cookie

share cookies between XMLHttpRequests and cordova plugin

我正在努力使用 crosswalkcordova 插件 javacode 让它们共享相同的 cookie。

在 javascript 中创建了一个身份验证 cookie,并在 XMLHttpRequest 秒内更新到我的 webservice

在 Java 中,我有一个 IntentService 被调用 onHandleIntent,例如当发生位置更新时。 在我的 onHandleIntent 内部,我想使用相同的 cookie 调用与上述 javascript 部分相同的 webservice。 要检索 cookie,我调用 new XWalkCookieManager().getCookie(url) 并使用它在 Java 中进行 HTTP 调用,包括该 cookie。

当应用程序完全关闭(通过 TaskManager)时,我的 onHandleIntent 仍然被调用。但是我不能调用 getCookie(url),因为人行横道不是 运行。 getCookie(url) 无法捕获的崩溃 (ndk)。

我已经尝试将当前 cookie 缓存在我的 MainActivitys onStop 中,它在某些设备上有效。但在其他设备上,应用程序通常会在没有适当停止行为的情况下关闭。所以这是非常脆弱的。

所以我的问题是:有没有办法在应用程序关闭时获取人行横道 cookie,或者拦截 javascript 完成的所有请求并缓存 cookie关闭应用程序时准备好正确的那个?

既然有人问我是如何解决的,这里是我的繁重的解决方法,包含 3 个部分。

  1. 每个Request/Response 我的 cordovaapp 使用 angular 并且我放置了一个 $http-interceptor 来拦截每个响应。每当检索到响应时,它都会调用我的本机插件并调用方法 "updateLocalCookie"。在插件 Javacode 中,我将实际的 cookie 放入 SharedPreferences-String.
  2. 每当需要来自 plugin/Java 代码的调用时 从SharedPreferences获取当前cookie,根本不要求crosswalk获取cookie。
  3. 每当检索到 plugin/Java 代码中的响应时 这部分也很重要。您通常还想将检索到的 cookie 写回人行横道。但是 XWalkCookieManager.setCookies 当应用程序处于终止状态时也是不可能的。 所以我扩展了 MainActivity(在添加平台后使用 cordova 钩子)以包含一个 BroadcastReciever,它将 cookie 写回人行横道。 响应回调会将新的 cookie 存储在 SharedPreferences 中,并将发送广播。如果应用程序是 运行ning,则 BroadcastReciever 存在并写入 cookie。如果应用程序被杀死,MainActivity 不会 运行 所以这个广播将被忽略。 最后一个重要部分是,在每个应用程序启动时,还必须从 SharedPreferences 读取 cookie 并写入人行横道,因为您在应用程序停机期间错过了那些 cookie。

希望有所帮助,如果有什么不清楚的地方,请随时再次 ask/comment,因为这是一个非常混乱的解决方法。