android 清除cookie,Android实现清除单个域名的cookie

8731a31b6c853550098db38145cbb69d.png

今天PM提了个需求:用户退出当前网页时,只清除该网页访问的域名相关的cookie,保留其他域名的cookie。

查了一下CookieManager的API,发现只有removeAllCookie(),没有清除单独域名cookie的API。。。想想也是,用了这么多年的浏览器,啥时候见过这功能?

既然系统没有提供接口,那就是只能自己想办法去清了。

首先要搞清楚Cookie存在哪里吧?

在/data/data//app_webview目录下,找到一个Cookies文件,虽然它没有.db扩展名,但是其实它就是一个sqlite数据库!进去看一下,数据都存在里面的cookies表里:

sqlite> .tables

cookies meta

sqlite> .dump cookies

PRAGMA foreign_keys=OFF;

BEGIN TRANSACTION;

CREATE TABLE cookies (creation_utc INTEGER NOT NULL UNIQUE PRIMARY KEY,host_key TEXT NOT NULL,name TEXT NOT NULL,value TEXT NOT NULL,path TEXT NOT NULL,expires_utc INTEGER NOT NULL,secure INTEGER NOT NULL,httponly INTEGER NOT NULL,last_access_utc INTEGER NOT NULL, has_expires INTEGER NOT NULL DEFAULT 1, persistent INTEGER NOT NULL DEFAULT 1,priority INTEGER NOT NULL DEFAULT 1,encrypted_value BLOB DEFAULT "",firstpartyonly INTEGER NOT NULL DEFAULT 0);

INSERT INTO "cookies" VALUES(13122904895970126,".hm.baidu.com","HMACCOUNT","1E0666871DC4BB45","/",13792186776970126,0,0,13122906283432123,1,1,1,X"",0);

INSERT INTO "cookies" VALUES(13122905170226445,".facebook.com","reg_fb_ref","https%3A%2F%2Fm.facebook.com%2F%3Frefsrc%3Dhttps%253A%252F%252Fwww.facebook.com%252F","/",0,0,1,13122905170226445,0,0,1,X"",0);

INSERT INTO "cookies" VALUES(13122905170227182,".facebook.com","reg_fb_gate","https%3A%2F%2Fm.facebook.com%2F%3Frefsrc%3Dhttps%253A%252F%252Fwww.facebook.com%252F","/",0,0,1,13122905170227182,0,0,1,X"",0);

INSERT INTO "cookies" VALUES(13122905170227393,".facebook.com","m_ts","1478103992","/",0,0,0,13122905170227393,0,0,1,X"",0);

INSERT INTO "cookies" VALUES(13122905172258460,".facebook.com","datr","uxMaWFe4eAqp6W2_dDu2MpA1","/",13185977172258460,0,1,13122905172258460,1,1,1,X"",0);

INSERT INTO "cookies" VALUES(13122905172508865,".facebook.com","fr","0EhMpmXi6717eJE6Y..BYGhO4.Dd.AAA.0.0.BYGhO7.AWUFjMmY","/",13130681172508865,0,1,13122905172508865,1,1,1,X"",0);

CREATE INDEX domain ON cookies(host_key);

CREATE INDEX is_transient ON cookies(persistent) where persistent != 1;

COMMIT;

这里面存储的其实就是HTTP头里的Set-Cookie字段包含的所有信息,以facebook为例,拼起来其实就是:

Set-Cookie: m_ts=1478103992; datr=uxMaWFe4eAqp6W2_dDu2MpA1; fr=OEhMpmXi6717eJE6Y; path=/; domain=.facebook.com

只要我们把这些信息清除掉,webview下次发请求的时候就没有有效cookie了。最直接的想法,调用CookieManager的setCookie()方法,把这些字段清空或者设置为过期不就行了?在StackOverflow上搜了一下,找到一个帖子讨论类似的思想,试了一下发现还是不行。。。

原文链接:http://stackoverflow.com/questions/2834180/how-to-remove-cookies-using-cookiemanager-for-a-specific-domain/11621738#11621738

下面说一说遇到的一堆坑吧:

1. 同一个域名,http跟https两种情况下cookie带的参数是不一样的。举个例子,http://www.facebook.com跟https://www.facebook.com,通过CookieManager.getCookie()获取 的参数是完全不一样的。这个问题困扰了我一个多小时,因为我发现有些参数死活清不掉。。。

2. Cookies表里有一堆以“.”开头的域名,比如表里的那个“.facebook.com”,它的一些参数用完全域名删不掉。比如针对http://www.facebook.com调用CookieManager.setCookie()清除字段信息,你会发现表里多了一项"www.facebook.com"的记录,而原来的".facebook.com"的记录仍然存在而且字段信息没有被清除。

3. 使用以“.”开头的域名,比如".facebook.com",调用CookieManager.getCookie()时获取不到全的参数列表。

4. 不同的网站会在Cookies表里增加多项记录,以facebook为例,表里可能会存"www.facebook.com"、".www.facebook.com"、".facebook.com"这3种记录。

最后说结论吧,几经周折,总算找到一个能用的方法,亲测5.1 / 6.0平台可用。其实也很简单粗暴,就是把上面第4条提到的那几种记录统统撸一遍,宁可错杀一千,也不放过一个。。。

附上代码(注意domain参数是带上协议的全域名,比如https://www.baidu.com):

private static void deleteCookiesForDomain(Context context, String domain) {

CookieManager cookieManager = CookieManager.getInstance();

if (cookieManager == null) return;

/* http://code.google.com/p/android/issues/detail?id=19294 */

if (Build.VERSION.SDK_INT < 11) {

/* Trim leading "."s */

if (domain.startsWith(".")) domain = domain.substring(1);

}

String cookieGlob = cookieManager.getCookie(domain);

if (cookieGlob != null) {

String[] cookies = cookieGlob.split(";");

for (String cookieTuple : cookies) {

String[] cookieParts = cookieTuple.split("=");

HashSet domainSet = getDomainSet(domain);

for (String dm : domainSet) {

/* Set an expire time so that this field will be removed after calling sync() */

cookieManager.setCookie(dm, cookieParts[0] + "=; Expires=Wed, 31 Dec 2015 23:59:59 GMT");

}

}

cookieManager.sync();

}

}

private static HashSet getDomainSet(String domain) {

HashSet domainSet = new HashSet<>();

String host = Uri.parse(domain).getHost();

domainSet.add(host);

domainSet.add("." + host);

// exclude domain like "baidu.com"

if (host.indexOf(".") != host.lastIndexOf(".")) {

domainSet.add(host.substring(host.indexOf(".")));

}

return domainSet;

}

以上这篇Android实现清除单个域名的cookie就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持云海天教程。

<think>好的,我现在要帮用户弄清楚如何清除指定页面的缓存。首先,用户的问题是关于清除特定页面的缓存,而不是整个浏览器或者应用的缓存。我需要考虑不同的场景,比如不同的浏览器、操作系统,或者移动端的情况。可能用户是开发者,也可能是普通用户,所以需要分别说明几种常见的方法。 首先,我应该回忆一下常见浏览器中清除单个页面缓存的方法。通常,浏览器没有直接清除单个页面缓存的功能,但可以通过开发者工具或者某些变通方法实现。比如,使用硬刷新(Ctrl+F5)或者清除特定时间段内的缓存,但可能不够精确。 然后,可能需要分步骤介绍不同浏览器的方法,比如Chrome、Firefox、Edge等。比如在Chrome中,可以打开开发者工具,右键刷新按钮选择“清空缓存并硬刷新”,或者通过Network面板禁用缓存。此外,还可以提到通过地址栏输入chrome://settings/clearBrowserData来清除特定时间范围的缓存,但这里可能无法指定单个页面。 对于移动端,比如Android的WebView或iOS的WKWebView,可能需要不同的方法,或者使用浏览器应用内的设置。不过用户可能指的是普通用户如何操作,而不是开发者,所以可能需要更简单的方法。 另外,可能用户是网站管理员,想要让用户更新缓存,这时候可以建议使用更改资源URL的方法,比如添加版本号或者时间戳,例如style.css?v=2,这样浏览器会当作新文件重新加载。 需要确保回答清晰,分点说明,覆盖不同情况和用户类型。同时,要检查是否有遗漏的方法,比如使用扩展程序或第三方工具,但可能不推荐普通用户这样做。最后总结一下不同方法的适用场景,帮助用户选择最合适的解决方案。</think>指定页面的缓存可以通过以下几种方式实现,具体方法取决于你的使用场景和设备类型: --- ### **一、浏览器手动操作(普通用户)** 1. **强制刷新页面(最简单)** - **Windows/Linux**:按 `Ctrl + F5` 或 `Shift + F5`。 - **Mac**:按 `Command + Shift + R`。 - **效果**:跳过本地缓存,直接从服务器重新加载页面。 2. **清除单个域名缓存(部分浏览器支持)** - 在 Chrome 地址栏输入 `chrome://settings/siteData`,搜索目标网站域名,点击删。 - Firefox 可在设置中搜索 "Cookie 和网站数据",手动选择域名。 --- ### **二、开发者工具(适合调试)** 1. **Chrome/Firefox/Edge** - 打开页面后按 `F12` 进入开发者工具。 - **禁用缓存**:在 **Network(网络)** 面板勾选 **Disable cache**(刷新后生效)。 - **清除单个文件缓存**:右键请求的资源文件,选择 **Clear browser cache**(部分浏览器支持)。 -- ### **三、服务器或前端配置(开发者适用)** 如果希望用户自动更新缓存,可通过修改资源 URL 强制浏览器重新下载: 1. 在 CSS/JS 文件链接中添加版本号: ```html <script src="app.js?v=2.0"></script> ``` 2. 使用文件哈希值(如 Webpack 打包自动生成)。 -- ### **四、移动端清除方法** - **Android Chrome**:长按地址栏右侧刷新按钮,选择 **硬重新加载**。 - **iOS Safari**:关闭页面后,进入设置 > Safari > 清除历史记录与网站数据(会清除全部缓存)。 -- ### **注意事项** - **无法精准清除单个页面缓存**:浏览器通常按域名或时间段清除,而非精确到某页面。 - **隐私模式**:临时测试可用无痕窗口(`Ctrl + Shift + N`)避免缓存干扰。 根据你的需求选择合适的方法即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值