背景
在项目中,用户登录后,需要为白名单中的 host 注入特定的cookies,在用户退出登录的时候,需要将注入的 cookies 清除(只清除app自己注入的cookies,h5 注入的cookies不要清除)。
实现
Android 的webview 并没有提供针对单个host 清除cookies的方法,只有全部清除,因此主要思路是将需要删除的cookies 设置为过期,再删除过期的即可,具体可以参考Android清除单个域名的cookie
当然,设置cookies过期有两种方法:
Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT;
使用Cookie的: Expires 属性. 它可以设置cookie的过期时间. 下面的代码表示id这条cookie的过期时间是2015年10月21日早上7点28分;
Set-Cookie: id=a3fWa; Max-Age=86400
使用Cookie的: Max-Age 属性. 它可以指定从现在开始Cookie存在的秒数. 秒数过完则cookie过期
参考 aisowe
问题
但是在清理的时候,发现总是不能清除掉指定cookie,打印出来发现:同一个host,比如 baidu.com ,它的cookie里面有2个key是一样的,但是值不一样,清理的时候,指定host 为baidu.com ,但是只能清除一个,另一个怎么也清理不掉。
这就很奇怪了,能想到的就是可能在多个不同的host下都注入了这个key,于是想办法要把它存储cookies的文件取出来看下。
我们知道,cookies 文件存储在 /data/data/
解决方案
不过我们安装Debug 的包的情况下,可能会有解决办法。因为 PackageManager 会检查 AndroidManifest.xml 中 isDebuggable 是不是false,这个值在我们打包的时候会根据你是打release包还是debug包而是不同的值,debug情况下是 isDebuggable = true,release 情况下是 true。
这样,我们将手机通过Android Studio 安装上debug包,进入shell:
adb shell
进入app 空间:
run-as
这样就能进入到app的内部空间,当然,也可以参考不root情况下读取data数据 ,此时我们再通过命令:
cd app_webview/
就能进到存放cookies的目录了,通过 ls 命令就能看到 Cookies 这个文件,这个文件是个数据库文件,可以使用sqlite3 打开。此时我们不能直接将其copy到我们电脑上,只能将其复制到我们的 sdcard 中:
cp Cookies /sdcard
此时,Cookies 文件已经被赋值到 sdcard,通过两次 exit 命令,就能退出 shell 模式,再通过 adb pull 命令,就能将其复制到电脑上了。
数据分析
在命令行打开Cookies 文件:
sqlite3 /desktop/Cookies
.dump cookies
就能看到cookies的数据了,这时候才发现,原来两个host都注入了这个key的cookie,一个是 baidu.com 一个是 .baidu.com,而后者是h5页面自己注入的,接下来问题就很明了了,将需要清除的cookies 按照前面的方法添加过期时间就ok,再手动执行删除过期cookies的操作,任务就完成了。
该篇文章旨在记录问题解决过程,详细过程这里略过。