我在应用的onCreate中调用了CookieManager. getInstance(). removeAllCookie()。
我遇到了一个奇怪的问题,我看到一个意外的cookie值在GET请求中被传递,事实上,这个cookie值是一个非常非常旧的值。
下面是我为测试执行的步骤:
1.安装应用程序
1.在应用启动时发出GET请求。请求应是干净的:不应发送cookie。
- GET请求以Set-Cookie响应。该值基于请求时间,因此在任何两个请求上该值相同的可能性非常小。
1.再发出一个GET请求。请求应发送步骤3中的cookie值。
我第一次安装这个应用程序时,cookie行为和我上面预期的一样。我卸载了这个应用程序,然后重新安装,cookie行为也和预期的一样。我这样做了几次,一切都很好。
然后,突然,在第N次安装时,第2步没有通过。第一个GET请求不是干净的。事实上,它带有一个在应用程序第一次安装时设置的值。
我不能可靠地重现这个问题,但我确实经常看到它。这并不是说安装时的第一个GET请求发送了上一次安装的cookie值--该值来自前三次或四次安装,这些安装都跟随着 * uninstalls *。
我怎么可能看到这个?我怎么才能真正删除应用程序的所有cookie?
5条答案
按热度按时间a2mppw5e1#
这是瞎猜的,但也许第一次安装的cookie在永久存储器中,而重新安装的cookie缓存在RAM中。也许删除所有cookie的操作由于某种原因没有同步到永久存储器中,所以它在重新安装之间保留了旧值。
引用
CookieSyncManager
的文档(强调我的):CookieSyncManager用于同步RAM和永久存储之间的浏览器cookie存储。为了获得最佳性能,浏览器cookie保存在RAM中。单独的线程保存之间的cookie,由计时器驱动。
...
同步间隔为5分钟,因此无论如何您都需要手动强制同步,例如在onPageFinished(WebView,String)中。请注意,即使sync()也会异步发生,因此不要在Activity关闭时执行同步。
这强烈表明,也许(在你的测试,我假设有时是在不到5分钟的时间间隔),当应用程序被卸载它还没有同步,所以旧的值从第一次安装仍然在持久存储在这一点上。我也没有理由假设同步会发生在卸载过程中,如果5分钟的间隔没有过去。
那就剩下一个问题了为什么有时一些cookie被发送,即使你在
onCreate
中清除了它们?事实证明removeAllCookie
is also asynchronous-有时它会在你发出第一个请求之前完成,有时它不会,在后一种情况下,它会发送仍然有效的值:第一次安装时的文件,这些文件仍在永久存储中。(请注意,我还在学习Android开发,我的一些假设可能是错误的--关于cookie是如何管理的,以及在activity's lifecycle中的一个状态下进行的异步调用在另一个状态下运行时是否仍未完成;但这种解释与你所描述的行为非常一致)
cczfrluj2#
请在调用Cookie同步管理器. getInstance().removeAllCookie()之后立即调用Cookie同步管理器. getInstance().sync()。
原因如@mgibsonbr所述,一个单独的线程保存cookie,由计时器驱动,以便立即显式调用CookieSyncManager.getInstance().sync()使其持久化。
ulmd4ohb3#
7qhs6swi4#
尝试下面的代码:
基本Http上下文
kpbwa7wx5#
根据文档,它已经被弃用了。所以,你可以在Kotlin中试试这个: