Cookie
- 什么是cookie:最简单理解就是由http衍生出来的一种特殊的浏览器的缓存,特点是具有时效性、账户相关性、存储在客户端等。
- 作用:作为客户端的用户认证的通行证,比如服务端可以通过cookie来区分到底是哪个用户。
- Android中Cookie的管理相关:说到cookie的管理,其实本质上就是数据的存储问题。在早期的cookie是由CookieSyncManager进行管理的,但是在sdk21之后CookieSyncManager被抛弃了,换成了CookieManager来进行管理。
- Android中Cookie的存储:目前Android系统WebView是将cookie存储data/data/package_name/app_webview这个目录下的一个叫Cookies的数据中,具体如下图所示:
CookieSyncManager
使用CookieSyncManager同步cookie数据:在早期手机硬件性能比较尴尬的时候,为了提升浏览器的性能,加快cookie的读写,浏览器的cookie是存储在手机的内存上的。但是,当当存储在内存上是不够的,还需要保存到存储器上,这时CookieSyncManager应运而生。借助于CookieSyncManager在内存和存储器之间同步浏览器的cookie。另外CookieSyncManager同步策略是在一个独立的线程里定时进行同步。
cookie开始同步:注意每次同步的时间间隔是5分钟
//推荐在Activity.onResume()里调用
CookieSyncManager.createInstance(context);
CookieSyncManager.getInstance().startSync();cookie停止同步:
//Activity.onPause()里调用
CookieSyncManager.getInstance().stopSync()cookie立即同步:调用了该方法会立即进行cookie的同步,代码如下:
//一般是在webview中的onPageFinished(WebView, String)方法进行强制同步
CookieSyncManager.getInstance().sync()删除cookie操作:
//通常删除cookie的是这样写的
CookieSyncManager.createInstance(this);
CookieManager.getInstance().removeAllCookie();
CookieManager.getInstance().removeSessionCookie();
CookieSyncManager.getInstance().sync();
CookieSyncManager.getInstance().startSync();
CookieManager
使用CookieManager管理cookie:从sdk21之后,webview已经内置了cookie的同步操作了。虽然不再需要关注cookie的同步,但是依然需要掌握删除cookie的操作。
删除cookie操作:底层实现是异步清除数据库的记录
//非常简洁
CookieManager.getInstance().removeAllCookies(null);
CookieManager.getInstance().flush();立即同步:注意到这个flush()方法就是立即同步cookie的操作,与CookieSyncManager中的sync()方法是一样的,其实查看CookieSyncManager的源码就会很清除了
/** * sync() forces sync manager to sync now * @deprecated Use {@link CookieManager#flush} instead. */ @Deprecated public void sync() { CookieManager.getInstance().flush(); }
总结
Cookie管理的兼容方案是:在sdk21以下使用CookieSyncManager,否则使用CookieManager。不论使用哪一种方式,其最终的底层实现都离不开对数据库的读写操作,而区别在于实现的策略不同罢了。