Android CookieManager.getInstance().removeAllCookie();不';不要删除所有的cookies

Android CookieManager.getInstance().removeAllCookie();不';不要删除所有的cookies,android,cookies,Android,Cookies,我在应用程序的onCreate中调用CookieManager.getInstance().removeAllCookie() 我遇到了一个奇怪的问题,我看到在get请求中传递了一个意外的cookie值。事实上,cookie值是一个非常非常古老的值 以下是我为测试执行的步骤: 安装应用程序 在应用程序启动时发出GET请求。请求应该是干净的:不应该发送cookies GET请求使用设置的Cookie进行响应。该值基于请求时间,因此在任何两个请求上该值相同的可能性很小 提出另一个GET请求。请求应发

我在应用程序的onCreate中调用CookieManager.getInstance().removeAllCookie()

我遇到了一个奇怪的问题,我看到在get请求中传递了一个意外的cookie值。事实上,cookie值是一个非常非常古老的值

以下是我为测试执行的步骤:

  • 安装应用程序
  • 在应用程序启动时发出GET请求。请求应该是干净的:不应该发送cookies
  • GET请求使用设置的Cookie进行响应。该值基于请求时间,因此在任何两个请求上该值相同的可能性很小
  • 提出另一个GET请求。请求应发送步骤3中的cookie值
  • 我第一次安装应用程序时,cookie行为正如我上面所预期的那样工作。我卸载了应用程序,然后重新安装,cookie行为再次按预期工作。我这样做过几次,一切都很好

    然后,突然,在第n次安装时,第2步没有通过。第一个GET请求不是干净的。事实上,它的值是在第一次安装应用程序时设置的

    我不能可靠地再现这个问题,但我确实经常看到它。安装时的第一个GET请求并不是发送上一次安装的cookie值——该值来自前三次或四次安装,之后都是卸载

    我怎么可能看到这个?如何删除应用程序的所有cookie?

    请尝试以下代码:

    基本HttpContext mHttpContext


    这是瞎猜,但可能第一次安装的cookie在持久存储中,而重新安装的cookie则缓存在RAM中。可能由于某种原因,删除所有cookie的操作没有同步到持久存储,因此在重新安装之间保留旧值

    引用(强调我的)文件:

    CookieSyncManager用于在RAM和永久存储之间同步浏览器cookie存储。为了获得最佳性能,浏览器cookie保存在RAM中。单独的线程将cookie保存在由计时器驱动的之间

    同步间隔为5分钟,因此您仍然需要手动强制同步,例如在onPageFinished(WebView,String)中。请注意,即使sync()也是异步进行的,所以不要在活动关闭时执行

    这强烈地表明,可能(在您的测试中,我假设有时在不到5分钟的时间间隔内进行测试),当卸载应用程序时,它还没有同步,因此第一次安装时的旧值此时仍在持久存储中。我也没有理由假设,如果5分钟的间隔没有过去,同步将在卸载过程中发生

    这就留下了一个问题:为什么有时会发送一些cookie,即使您在
    onCreate
    中清除了它们?结果是
    removeAllCookie
    ——有时它在您发出第一个请求之前就已经完成了,有时不会,在后一种情况下,它会发送仍然处于活动状态的值:第一次安装的值,这些值仍然在永久存储中


    (请注意,我仍在学习Android开发,我的一些假设可能是错误的——关于如何管理Cookie,关于在中的一种状态下进行的异步调用在另一种状态下运行时是否仍然未完成;但这种解释与您描述的行为非常一致)请在调用CookieManager.getInstance().removeAllCookie()后立即调用CookieSyncManager.getInstance().sync()


    原因如@mgibsonbr所述,一个单独的线程在两个线程之间保存cookie,由计时器驱动,以便使其持久化,并立即显式调用CookieSyncManager.getInstance().sync()

    欢迎来到SO。请省略仅代码答案。看见
    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
            CookieManager.getInstance().removeAllCookies(null);
        } else {
    
            CookieSyncManager.createInstance(context);
            CookieManager cookieManager = CookieManager.getInstance();
            if (cookieManager != null) {
                cookieManager.removeAllCookie();
            }
     CookieSyncManager.getInstance().sync();
    }
    
    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
            CookieManager.getInstance().removeAllCookies(null);
        } else {
    
            CookieSyncManager.createInstance(context);
            CookieManager cookieManager = CookieManager.getInstance();
            if (cookieManager != null) {
                cookieManager.removeAllCookie();
            }
     CookieSyncManager.getInstance().sync();
    }