3

我需要让 Android 上的 Crosswalk(在 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);
 }

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

我也尝试过使用标准的Android cookie Manager via CookieManager.getInstance().setCookie(cookie.getDomain(), cookieString);,但这似乎也被Crosswalk忽略了。

最好的,

安德烈亚斯

//编辑以供将来参考:

问题是 Crosswalk 期望 cookie url 以 https:// 开头,而原生 Android webview 不是(或者相反,我不确定了)。现在正常工作是将cookie设置两次,一次不使用https,一次使用https:

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

2 回答 2

4

您可以创建一个 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());
    }
}
于 2015-02-19T09:39:02.677 回答
2

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

这是因为在 Android WebView 中 CookieManager 的实现使用了 WebAddress(url).toString(),它会将方案 (http|https) 添加到 url 中。正如 CooieManagerAdapter 中的解释:WebAddress 是 android 框架中的私有 API,并且是 Classic WebView 实现的“怪癖”,它允许嵌入者放松他们传递给 CookieManager 的 URL,因此我们在进入 chromium 之前进行相同的规范化堆。

于 2016-04-26T07:06:04.773 回答