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

时间:2015-01-23 10:02:44

标签: android cordova cookies webview crosswalk-runtime

我需要在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。

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

最佳,

安德烈亚斯

//编辑以备将来参考:

问题在于Crosswalk希望cookie网址以https://开头,而本机Android网页浏览不是(或者反过来,我不再确定)。现在正常工作的是将cookie设置两次,一次不使用https,一次使用https:

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

2 个答案:

答案 0 :(得分: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());
    }
}

答案 1 :(得分: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,因此我们在进入chrome堆栈之前进行相同的规范化。