返回顶部
首页 > 资讯 > 移动开发 >Android实现清除单个域名的cookie
  • 257
分享到

Android实现清除单个域名的cookie

域名cookieAndroid 2022-06-06 18:06:43 257人浏览 薄情痞子
摘要

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

今天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,'.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;
    
    if (Build.VERSION.SDK_INT < 11) {
      
      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) {
          
          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就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持编程网。

您可能感兴趣的文章:Android中webView加载H5绑定cookie实例


--结束END--

本文标题: Android实现清除单个域名的cookie

本文链接: https://lsjlt.com/news/29930.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Android实现清除单个域名的cookie
    今天PM提了个需求:用户退出当前网页时,只清除该网页访问的域名相关的cookie,保留其他域名的cookie。 查了一下CookieManager的API,发现只有remove...
    99+
    2022-06-06
    域名 cookie Android
  • ASP.NET怎么实现登出系统并清除Cookie
    这篇文章主要介绍“ASP.NET怎么实现登出系统并清除Cookie”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“ASP.NET怎么实现登出系统并清除Cookie”文章能帮助大家解决问题。1.前端页面...
    99+
    2023-06-29
  • SpringBoot实现多个子域共享cookie的示例
    目录项目信息cookie 共享环境配置后端代码验证项目信息 使用SpringBoot web框架,版本号 2.7.10 <dependency> <gro...
    99+
    2023-05-15
    SpringBoot 子域共享cookie SpringBoot 子域共享
  • bootstrap清除浮动的类名是哪个
    这篇文章主要介绍了bootstrap清除浮动的类名是哪个的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇bootstrap清除浮动的类名是哪个文章都会有所收获,下面我们一起来看看...
    99+
    2024-04-02
  • OpenCV清除小面积连通域的实现方法
    场景需求        使用OpenCV,往往遇到这类场景:需要清除目标图像中比较小的噪声区,保留主要区域信息。     ...
    99+
    2024-04-02
  • php如何实现了一个简单的域名转发功能
    本篇内容介绍了“php如何实现了一个简单的域名转发功能”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!域名转发是一种常见的网站部署方式,通常用...
    99+
    2023-07-05
  • Android实现一个简单的单词本
    目录布局设计代码AddDanciActivity.javaDBOpenHelper.java效果图总结本文基于Java实现了一个简单的单词本安卓app,用的是SQLite数据库,包括...
    99+
    2024-04-02
  • Android实现多次闪退清除数据
    很多时候由于后台返回的数据异常,可能会导致App闪退。而如果这些异常数据被App本地缓存下来,那么即使杀掉进程重新进入还是会发生闪退。唯一的解决方法就是清除App数据,但是用户...
    99+
    2022-06-06
    数据 Android
  • Android简单实现加减乘除(两个EditText,两个TextView,四个button)
    #Android简单实现加减乘除(两个EditText,两个TextView,四个button) ##界面效果 ...
    99+
    2022-06-06
    button edittext Android
  • Android应用中怎么实现一个带清除功能的输入框
    本篇文章给大家分享的是有关Android应用中怎么实现一个带清除功能的输入框,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。一,自定义一个类,名为ClearEditTextpac...
    99+
    2023-05-31
    android roi
  • SpringBootSecurity实现单点登出并清除所有token
    目录需求记录token清除token解决登出时长过长需求 A、B、C 系统通过 sso 服务实现登录A、B、C 系统分别获取 Atoken、Btoken、Ctoken 三个 toke...
    99+
    2023-01-14
    SpringBoot Security单点登出 SpringBoot Security单点登出清除token
  • Android怎么实现一个简单的单词本
    这篇文章主要介绍了Android怎么实现一个简单的单词本的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Android怎么实现一个简单的单词本文章都会有所收获,下面我们一起来看看吧。本文基于Java实现了一个简单...
    99+
    2023-06-29
  • Android编程中黑名单的实现方法
    本文实例讲述了Android编程中黑名单的实现方法。分享给大家供大家参考,具体如下: 说明:由于挂断电话android   api不是对外开放的,所以需要使...
    99+
    2022-06-06
    黑名单 方法 Android
  • Android输入框控件ClearEditText实现清除功能
    本文给大家带来一个很实用的小控件ClearEditText,就是在Android系统的输入框右边加入一个小图标,点击小图标可以清除输入框里面的内容,IOS上面直接设置某个属性就...
    99+
    2022-06-06
    Android
  • 如何实现清除cookies的bat
    这篇文章主要为大家展示了“如何实现清除cookies的bat”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何实现清除cookies的bat”这篇文章吧。这是个小技巧,把手动清除cookies的...
    99+
    2023-06-08
  • 退出Android程序时清除所有activity的实现方法
    本文实例讲述了退出Android程序时清除所有activity的方法。分享给大家供大家参考,具体如下: 在一个项目中,要退出android程序,试了restartPackage...
    99+
    2022-06-06
    方法 activity Android
  • Nginx同一个域名配置多个项目的实现方法
    使用Nginx要在同一个域名下配置多个项目有两种方式: nginx按不同的目录分发给不同的项目 启用二级域名,不同的项目分配不同的二级域名 1.nginx按不同的目录分发...
    99+
    2024-04-02
  • Nginx怎么实现一个站点配置多个域名
    这篇文章给大家分享的是有关Nginx怎么实现一个站点配置多个域名的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一个站点配置多个域名server {  list...
    99+
    2024-04-02
  • Android项目实现黑名单拦截效果
    本文实例讲述了Android编程中黑名单的实现方法。分享给大家供大家参考,具体如下: 1,黑名单数据库创建 三个字段(_id 自增长字段 phone 黑名单号码 mode ...
    99+
    2022-06-06
    黑名单 Android
  • Android 后台运行白名单实现保活
    保活现状 我们知道,Android 系统会存在杀后台进程的情况,并且随着系统版本的更新,杀进程的力度还有越来越大的趋势。系统这种做法本身出发点是好的,因为可以节省内存,降低功耗...
    99+
    2022-06-06
    后台运行 运行 白名单 Android
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作