从Web视图中删除特定域中的所有Cookie

我想从一些域中删除所有的cookie,有没有办法做到这一点?

我看到的唯一方法是removeAllCookies。

谢谢。

根据文档 ,我们没有删除单个cookie的方法。 但是我们可以使用setCookie()来清除站点的cookie。 如,

public abstract void setCookie(String url,String value)

为给定的URL设置cookie。 具有相同主机, 路径和名称的任何现有cookie 都将替换为新cookie 。 如果已过期,将忽略正在设置的cookie。

因此,解决方案是,如本回答所述,我们需要手动清理每个主机密钥的每个cookie。 例如: – facebook

 android.webkit.CookieManager.getInstance().setCookie(".facebook.com", "locale="); android.webkit.CookieManager.getInstance().setCookie(".facebook.com", "datr="); android.webkit.CookieManager.getInstance().setCookie(".facebook.com", "s="); android.webkit.CookieManager.getInstance().setCookie(".facebook.com", "csm="); android.webkit.CookieManager.getInstance().setCookie(".facebook.com", "fr="); android.webkit.CookieManager.getInstance().setCookie(".facebook.com", "lu="); android.webkit.CookieManager.getInstance().setCookie(".facebook.com", "c_user="); android.webkit.CookieManager.getInstance().setCookie(".facebook.com", "xs="); 

首先,我建议您查看管理WebView使用的Cookie的CookieManager类。 有一个方法removeAllCookie()用于清除cookie但它在API级别21中已弃用,因此您可以使用removeAllCookeis(callback)方法。 如果您不需要知道操作何时完成或者是否删除了任何cookie,则可以传递null作为回调,在这种情况下,从没有Looper的线程调用该方法是安全的。

要清除棒棒糖或更多棒棒糖,您可以使用

 CookieManager.getInstance().removeAllCookies(null); CookieManager.getInstance().flush(); 

并在rest

 CookieSyncManager cookieSyncMngr=CookieSyncManager.createInstance(context); cookieSyncMngr.startSync(); CookieManager cookieManager=CookieManager.getInstance(); cookieManager.removeAllCookie(); cookieManager.removeSessionCookie(); cookieSyncMngr.stopSync(); cookieSyncMngr.sync(); 

@ Let’sRefactor的答案有正确的方向但实际上没有用,因为正如文档所述,我们必须使用’Set-Cookie’HTTP响应头格式:

valueString :使用’Set-Cookie’HTTP响应头的格式将cookie作为字符串

我编写了以下代码来删除任何特定域的cookie:

 public static void deleteCookies(String url) { CookieManager cookieManager = CookieManager.getInstance(); try { String domainName = Utils.getDomainName(url); String cookiesString = cookieManager.getCookie(url); String[] cookies = cookiesString.split("; "); for (String cookie : cookies) { if (Strings.isNullOrEmpty(cookie)) continue; int equalCharIndex = cookie.indexOf('='); if (equalCharIndex == -1) continue; String cookieString = cookie.substring(0, equalCharIndex) + '=' + "; Domain=" + domainName; cookieManager.setCookie(url, cookieString); } } catch (URISyntaxException e) { Log.e("TAG", "Message", e); } } 

以下代码获取没有子域的域:

 public static String getDomainName(@NotNull String url) throws URISyntaxException { URI uri = new URI(url); String domain = uri.getHost(); domain = domain.startsWith("www.") ? domain.substring(4) : domain; try { //Try to get the domain without subdomain. Ex: mobile.twitter.com would returns twitter.com //Note: InternetDomainName is from Guava library return InternetDomainName.from(domain).topPrivateDomain().toString(); } catch (IllegalStateException e) { Log.e("getDomainName()", "Illegal url"); } return domain; } 

Let'sRefactorAnT答案有助于为我找到最终解决方案。 所以基本上我们需要逐个清理每个cookie。 但对我来说,设置"value=""value=; Domain=my.domain.com"是行不通的。 我想这是我正在加载的页面的问题,我无法控制(它是在读取cookie时打印崩溃堆栈跟踪)。 所以对我来说,最终解决方案是删除cookie,而不是清空它们。 当然我们没有任何用于删除特定cookie的API,但我们可以使用Max-Age的'Set-Cookie'响应头格式参数。 我的最终代码看起来像这样(Kotlin,在生产代码中我当然有常量字符串;)):

 val domain = myPageUri.host CookieManager.getInstance().apply { getCookie(domain) .split("; ") .filter { it.isNotNullOrBlank() } .forEach { val newCookieValue = it.substringBefore("=") + "=; Max-Age=-1" setCookie(domain, newCookieValue) } } 

substringBefore(character: String)只是我们在String上的扩展函数,用于从开始到第一次出现的character返回子字符串。