Cordova会话cookie在Android Lollipop上无法正常工作

11

我为 Android 开发了一款 Cordova/Phonegap 应用程序,它使用会话 Cookie 登录第三方网站。 为此,我使用 jQuery 进行 AJAX post 请求,然后 Cookie 会自动设置。

但是,当我将智能手机更新到 Android Lollipop 5.0 并将应用程序库更新到 API 级别 21 后,Cookie 停止工作了。发生了什么变化?

1个回答

26
经过数小时在互联网上寻找解决方案后,我发现了一篇很好地解释了这个问题的文章,因此我在这里发布它,因为我认为对其他 Stack Overflow 用户有用。

基本上,问题出在新的 Android 第三方 Cookie 策略(https://developer.android.com/about/versions/android-5.0-changes.html#BehaviorWebView),默认情况下会阻止它们。

解决办法是向主活动添加几行代码:

public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    super.init();

    // Allow third party cookies for Android Lollipop
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        WebView webView = (WebView)super.appView;
        CookieManager cookieManager = CookieManager.getInstance();
        cookieManager.setAcceptThirdPartyCookies(webView,true);
    }

    super.loadUrl(Config.getStartUrl());
}

为了获取更多信息,我在这里放置了完整文章的链接:http://joashpereira.com/blog/2014/11/19/fix-to-cordovaphonegap-apps-targeting-android-5-lollipop-or-later-on-default-disallowing-third-party-cookies/


1
即使您不使用Cordova,仅在Webview中使用JavaScript进行ajax调用,此解决方案仍然适用。 - e4c5
1
这是默认应用于[Cordova Android 3.7.1](https://cordova.apache.org/announcements/2015/02/06/cordova-android-3.7.1.html),请参考[issue](https://issues.apache.org/jira/browse/CB-8026)和[commit](https://git-wip-us.apache.org/repos/asf?p=cordova-android.git;h=15e1948)。因此,在使用本文之前,请查看您的`CordovaWebView`文件。 - Dunc
谢谢!这种行为与我用来构建应用程序的Qt WebView不同。现在它真的应该出现在每个介绍Android WebView的教程中,因为它与过去和其他实现的行为不同。 - Samuel Danielson
@josemmo 如果我们在同一个活动中有两个 WebViews,我们是否应该为它们都声明 cookieManager.setAcceptThirdPartyCookies(webView,true);?我希望只有第二个 WebView 的 cookies 对第一个 WebView 可见。 - user1788736
@user1788736,您需要为每个WebView调用setAcceptThirdPartyCookies以使其具有cookie功能,尽管我认为仅凭这一行代码无法实现该定制级别。也许您可以发布一个新问题? - josemmo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接