Android WebView / CookieSyncManager 中会话 cookie 的生命周期

Posted

技术标签:

【中文标题】Android WebView / CookieSyncManager 中会话 cookie 的生命周期【英文标题】:Lifecycle of a session cookie in an Android WebView / CookieSyncManager 【发布时间】:2013-06-07 18:18:33 【问题描述】:

我有一个 android 应用程序,它通过 WebView 和 HttpClient 向我的网络服务器发出请求。我使用 CookieSyncManager 在两者之间同步 cookie。到目前为止,一切都很好。

当我的应用程序启动时(在 onResume() 中),我运行了一段类似于以下的逻辑:

if ( appHasBeenIdleFor30Minutes() ) 
     CookieManager cookieManager = CookieManager.getInstance();
     cookieManager.removeSessionCookie();
     CookieSyncManager.getInstance().sync();

这会正确重置从用户上一个会话中设置的所有会话 cookie。我的问题是:这种行为会周期性地自行发生吗? 这个问题 (android webview or browser not deleting session cookies on device reboot) 似乎表明它不会。当我通过服务使用 cookie 同步的 HttpClient 时,似乎没有清除会话 cookie,从而导致奇怪的服务器端行为。

我一直无法在 WebView/CookieSyncManager 中找到有关会话 cookie 生命周期(过期时间=0)的具体文档 - 还有其他人运气更好吗?

【问题讨论】:

您的问题和回答对我有帮助,但出于安全考虑,我建议您在服务器端过期 cookie。有人可能会拦截 cookie 值,即使您在客户端将其过期,相同的值也可能被用来劫持会话。另请注意,您应该考虑 ode 用户不受信任,他们可以通过更改您的 apk 甚至使用 Xposed 框架之类的东西来改变这种行为。 【参考方案1】:

我直接收到了一位 Google 工程师的回复,证实了我的怀疑:

您是对的,会话 cookie 不会在 WebView 的生命周期。 如果您发现此问题,您可以随时清除所有 cookie 或用空值明确覆盖您的会话 cookie。

您建议的代码看起来是一个很好的解决方法,请注意 使用 CookieSyncManager 的 cookie 同步不是同步的 - 执行 startSync()、stopSync() 和 sync() 命令 在后台线程中异步进行。

TL;DR - WebView 关闭时会话 cookie 不会过期,您必须自己管理。

【讨论】:

如果您能提供此答案的链接,那就太好了。

以上是关于Android WebView / CookieSyncManager 中会话 cookie 的生命周期的主要内容,如果未能解决你的问题,请参考以下文章

可以在 React Native 的 WebView 中访问 Cookies 吗?

在iOS上反应Native WebView缺少会话cookie

C# cookies 丢失

wkwebviews之间的Cookies共享

Cookies的两种存取方式

flutter webview插件打开缩小窗口