【问题标题】:Set cookies programatically in Crosswalk WebView on Android在 Android 上的 Crosswalk WebView 中以编程方式设置 cookie
【发布时间】:2015-01-23 10:02:44
【问题描述】:

我需要在 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 url 以 https:// 开头,而原生 Android webview 不是(或者相反,我不确定了)。现在正常工作是将cookie设置两次,一次没有https,一次使用https:

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

【问题讨论】:

    标签: android cordova cookies webview crosswalk-runtime


    【解决方案1】:

    您可以创建一个 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());
        }
    }
    

    【讨论】:

    • 啊,非常感谢!我不知道“setXWalkCookieManager”方法。我会在星期一试试这个,让你知道它是否适合我。
    • 实际上 setXWalkCookieManager 是我的 requestExecutor 上的自定义方法(在您的项目中,它将是您使用 HttpClient 的类)。在你的情况下,你应该只使用 mCookieManager 而不是你的 cookieManager。
    • mhm 我想我已经尝试过了,只是没有设置任何 cookie。您知道您目前使用的是哪个版本的人行横道吗?
    • 我实际上正在使用 crosswalk-webview-10.39.235.15-x86。我在 onCreate 方法期间初始化 XWalkCookieManager,然后将其传递给填充 cookie 的 requestExecutor(身份验证由 android 部分进行)。它确实有效!
    • 非常感谢!我目前无法检查,但也许我使用的是旧版本或有其他错误。知道它对你有用会很有帮助,所以我不会放弃尝试 :-)
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2016-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-23
      • 1970-01-01
      相关资源
      最近更新 更多