91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Android實現清除單個域名的cookie

發布時間:2020-09-23 12:35:02 來源:腳本之家 閱讀:191 作者:TurkeyCock 欄目:移動開發

今天PM提了個需求:用戶退出當前網頁時,只清除該網頁訪問的域名相關的cookie,保留其他域名的cookie。

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

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

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

在/data/data/<package>/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,'.#','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<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實現清除單個域名的cookie就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持億速云。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

贵南县| 浦东新区| 宣汉县| 任丘市| 黄石市| 米脂县| 绥棱县| 黔西| 双桥区| 鸡东县| 嘉义市| 乌拉特前旗| 新源县| 澄迈县| 射阳县| 双桥区| 靖远县| 梁山县| 沅江市| 丰宁| 大洼县| 灵宝市| 平安县| 尤溪县| 岳西县| 济南市| 开平市| 临朐县| 海丰县| 休宁县| 白城市| 方山县| 静乐县| 格尔木市| 白河县| 桂东县| 鄱阳县| 万安县| 和静县| 罗定市| 丰原市|