av一区二区在线观看_亚洲男人的天堂网站_日韩亚洲视频_在线成人免费_欧美日韩精品免费观看视频_久草视

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Android實(shí)現(xiàn)清除單個(gè)域名的cookie

瀏覽:112日期:2022-09-25 13:22:09

今天PM提了個(gè)需求:用戶退出當(dāng)前網(wǎng)頁(yè)時(shí),只清除該網(wǎng)頁(yè)訪問的域名相關(guān)的cookie,保留其他域名的cookie。

查了一下CookieManager的API,發(fā)現(xiàn)只有removeAllCookie(),沒有清除單獨(dú)域名cookie的API。。。想想也是,用了這么多年的瀏覽器,啥時(shí)候見過這功能?

既然系統(tǒng)沒有提供接口,那就是只能自己想辦法去清了。

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

在/data/data/<package>/app_webview目錄下,找到一個(gè)Cookies文件,雖然它沒有.db擴(kuò)展名,但是其實(shí)它就是一個(gè)sqlite數(shù)據(jù)庫(kù)!進(jìn)去看一下,數(shù)據(jù)都存在里面的cookies表里:

sqlite> .tablescookies meta sqlite> .dump cookiesPRAGMA 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;

這里面存儲(chǔ)的其實(shí)就是HTTP頭里的Set-Cookie字段包含的所有信息,以facebook為例,拼起來其實(shí)就是:

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

只要我們把這些信息清除掉,webview下次發(fā)請(qǐng)求的時(shí)候就沒有有效cookie了。最直接的想法,調(diào)用CookieManager的setCookie()方法,把這些字段清空或者設(shè)置為過期不就行了?在StackOverflow上搜了一下,找到一個(gè)帖子討論類似的思想,試了一下發(fā)現(xiàn)還是不行。。。

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

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

1. 同一個(gè)域名,http跟https兩種情況下cookie帶的參數(shù)是不一樣的。舉個(gè)例子,http://www.facebook.com跟https://www.facebook.com,通過CookieManager.getCookie()獲取 的參數(shù)是完全不一樣的。這個(gè)問題困擾了我一個(gè)多小時(shí),因?yàn)槲野l(fā)現(xiàn)有些參數(shù)死活清不掉。。。

2. Cookies表里有一堆以“.”開頭的域名,比如表里的那個(gè)“.facebook.com”,它的一些參數(shù)用完全域名刪不掉。比如針對(duì)http://www.facebook.com調(diào)用CookieManager.setCookie()清除字段信息,你會(huì)發(fā)現(xiàn)表里多了一項(xiàng)'www.facebook.com'的記錄,而原來的'.facebook.com'的記錄仍然存在而且字段信息沒有被清除。

3. 使用以“.”開頭的域名,比如'.facebook.com',調(diào)用CookieManager.getCookie()時(shí)獲取不到全的參數(shù)列表。

4. 不同的網(wǎng)站會(huì)在Cookies表里增加多項(xiàng)記錄,以facebook為例,表里可能會(huì)存'www.facebook.com'、'.www.facebook.com'、'.facebook.com'這3種記錄。

最后說結(jié)論吧,幾經(jīng)周折,總算找到一個(gè)能用的方法,親測(cè)5.1 / 6.0平臺(tái)可用。其實(shí)也很簡(jiǎn)單粗暴,就是把上面第4條提到的那幾種記錄統(tǒng)統(tǒng)擼一遍,寧可錯(cuò)殺一千,也不放過一個(gè)。。。

附上代碼(注意domain參數(shù)是帶上協(xié)議的全域名,比如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<String> 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<String> getDomainSet(String domain) { HashSet<String> 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實(shí)現(xiàn)清除單個(gè)域名的cookie就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Android
相關(guān)文章:
主站蜘蛛池模板: 精品免费国产一区二区三区四区介绍 | 欧美一区永久视频免费观看 | 九九九视频精品 | www国产亚洲精品久久网站 | 国产精品一区久久久 | 亚洲 中文 欧美 日韩 在线观看 | 久久亚洲天堂 | 91电影 | 欧美一区在线视频 | 日韩久久精品电影 | av网址在线| 中文字幕精品一区 | 一区二区av | 日韩a | 伊人久久综合 | 伊人焦久影院 | 久久伊人久久 | 一区二区三区av夏目彩春 | 亚洲精选一区二区 | 国产在线观看一区二区三区 | 日韩在线 | 国产精品久久久久久久久久久免费看 | 一级免费毛片 | 成人网在线观看 | 国产成人精品一区二 | 99精品国产一区二区青青牛奶 | 亚洲色图50p | 欧美成人精品 | 精品久久久久久久久久久久 | 国产高清在线精品一区二区三区 | 在线一区 | 亚洲视频在线一区 | 欧美国产日韩成人 | 在线资源视频 | 亚洲视频二区 | 久久精品视频免费看 | 久久亚洲欧美日韩精品专区 | 精品av| 精品免费国产一区二区三区四区介绍 | 日本成年免费网站 | 国产成人精品综合 |