在 Android 上以编程方式在 Crosswalk WebView 中设置 cookie

Set cookies programatically in Crosswalk WebView on Android

我需要在 Android(在 Cordova 项目中)上使用一些 我通过 Apache HttpClient 收集的 cookie。 但是我不确定如何实现这一目标。我试着尝试 XWalkCookieManager 但我认为我所做的一切 XWalkCookieManager 被忽略。我将在哪里初始化 cookie 经理?这还支持吗?

//cookieStore contains the cookies I got via a request from the Apache
// HttpClient.
 List<Cookie> cookies = cookieStore.getCookies();
 for (int i = 0; i < cookies.size(); i++) {
     Cookie cookie = cookies.get(i);
     String cookieString = buildCookieStringFromCookie(cookie);

     // This is a XWalkCookieManager I initialized earlier but it doesn't do anything 
     //as far as I can tell.
     cookieManager.setCookie(cookie.getDomain(),cookieString);
 }

我真的很感激任何帮助,这是唯一的事情 目前使我无法成功使用人行横道。

我也曾尝试通过 CookieManager.getInstance().setCookie(cookie.getDomain(), cookieString); 使用标准 Android cookie 管理器,但这似乎也被 Crosswalk 忽略了。

最佳,

安德烈亚斯

//编辑以备将来参考:

问题是 Crosswalk 期望 cookie url 以 https:// 开头,而本机 Android webview 不期望(或者反过来,我不确定了) ).现在可以正常工作的是设置 cookie 两次,一次不使用 https,一次使用 https:

   mCookieManager.setCookie(cookie.getDomain(), cookieString);
   mCookieManager.setCookie("https://" + cookie.getDomain(), cookieString);

您可以创建一个 XWalkCookieManager 实例并在其中设置不同的 cookie。 它似乎在 XwalkViews 中共享。

// Your can use this inside the onCreate() method
private XWalkCookieManager mCookieManager;
mCookieManager = new XWalkCookieManager();
mCookieManager.setAcceptCookie(true);
mCookieManager.setAcceptFileSchemeCookies(true);

// Pass it to your request executor
httpRequestExecutor.setXWalkCookieManager(mCookieManager);
//You're now able to add your cookies to this manager rather than to your cookieManager

我们如何从 HttpResponse 中提取 cookie:

responseHeaders = response.getAllHeaders();
for (int i = 0; i < responseHeaders.length; i++)
{
    Header header = responseHeaders[i];
    if (header.getName().equalsIgnoreCase("set-cookie"))
    {
        mCookieManager.setCookie(request.getUrl(), header.getValue());
    }
}

XWalkCooikeManager 的实现与 Android CookieManager 略有不同。 您应该在 cookie.getDomain() 之前添加方案 (http|https)。

这是因为 Android WebView 中 CookieManager 的实现使用了 WebAddress(url).toString(),它会将方案 (http|https) 添加到 url。 正如 CooieManagerAdapter 中的解释: WebAddress 是 android 框架中的私有 API 和经典 WebView 实现的 "quirk",它允许嵌入器对他们传递给 CookieManager 的 URL 放宽,所以我们进行相同的规范化在进入铬堆栈之前。