Android 如何使用CookieManager删除特定域的Cookie?

Android 如何使用CookieManager删除特定域的Cookie?,android,cookies,webkit,Android,Cookies,Webkit,我知道存在,但如何仅删除域的Cookie 有人能帮我写一些代码片段吗?我在API中看不到这样做的方法,但是你可以一直深入研究真正的源代码(开源很好)。。。例如,我在这个类中发现了这个deleteCookies方法:它是Android核心的一部分 如你所见。。。Cookie只是SQLite数据库中的行。。。因此,如果你能让这个类工作,至少你知道如何自己去做。我在API中看不到这样做的方法,但你总是可以深入研究真正的源代码(开源很好)。。。例如,我在这个类中发现了这个deleteCookies方法:

我知道存在,但如何仅删除域的Cookie


有人能帮我写一些代码片段吗?

我在API中看不到这样做的方法,但是你可以一直深入研究真正的源代码(开源很好)。。。例如,我在这个类中发现了这个
deleteCookies
方法:它是Android核心的一部分


如你所见。。。Cookie只是SQLite数据库中的行。。。因此,如果你能让这个类工作,至少你知道如何自己去做。

我在API中看不到这样做的方法,但你总是可以深入研究真正的源代码(开源很好)。。。例如,我在这个类中发现了这个
deleteCookies
方法:它是Android核心的一部分


如你所见。。。Cookie只是SQLite数据库中的行。。。因此,如果你能让这个类工作,至少你知道如何自己做。

调用android.webkit.CookieManager的
getCookie
方法为你感兴趣的URL或域生成RFC2109
Cookie
头。解析cookie头以获取cookie名称列表。对于每个cookie名称,为该名称生成一个RFC 2109
Set cookie
头,该名称的过期日期在过去,并将其传递到
CookieManager
setCookie
方法中。尽管API文档指定
setCookie
忽略已过期的值,但在这种情况下,Android当前的实现实际上会刷新cookie。为了防止将来的实现忽略文档中指定的过期值,检查Cookie是否已实际删除,如果CookieManager未执行,则执行一些回退行为-
removeAllCookie
方法可能对此回退有用。

调用
android.webkit.CookieManager
getCookie
方法为URL或URL生成RFC2109
Cookie
头你感兴趣的领域。解析cookie头以获取cookie名称列表。对于每个cookie名称,为该名称生成一个RFC 2109
Set cookie
头,该名称的过期日期在过去,并将其传递到
CookieManager
setCookie
方法中。尽管API文档指定
setCookie
忽略已过期的值,但在这种情况下,Android当前的实现实际上会刷新cookie。为了防止将来的实现忽略文档中指定的过期值,请检查cookie是否已实际删除,如果没有,则执行一些回退行为-
CookieManager
removeAllCookie
方法可能有助于此回退。

public void clearCookies(字符串域) {
public void clearCookies(String domain) {
    CookieManager cookieManager = CookieManager.getInstance();
    String cookiestring = cookieManager.getCookie(domain);
    String[] cookies =  cookiestring.split(";");
    for (int i=0; i<cookies.length; i++) {
        String[] cookieparts = cookies[i].split("=");
        cookieManager.setCookie(domain, cookieparts[0].trim()+"=; Expires=Wed, 31 Dec 2025 23:59:59 GMT");
    }
}
CookieManager CookieManager=CookieManager.getInstance(); 字符串cookiestring=cookieManager.getCookie(域); 字符串[]cookies=cookiestring.split(“;”); 对于(int i=0;i
public void clearCookies(字符串域){
CookieManager CookieManager=CookieManager.getInstance();
字符串cookiestring=cookieManager.getCookie(域);
字符串[]cookies=cookiestring.split(“;”);

对于(inti=0;i,这里是一个开源项目的代码示例。也许可以帮助某人


这是一个开源项目的代码示例。也许可以帮助别人



我知道这有点旧,但我自己也在研究这个问题。如果我自己修改webview.db数据库,是否有可能发生冲突?如果CookieSyncManager或webview在我修改它时访问它,是否存在线程安全和锁定问题?我知道这有点旧,但我自己也在研究。是否有可能使用c如果我自己修改webview.db数据库会发生冲突?如果CookieSyncManager或webview在我修改它时访问它,是否会出现线程安全和锁定问题?android中是否有任何cookie解析器可以帮助我们解决此问题?还是我们应该只做split()还有我们自己?@Enigma阅读RFC,它描述了cookie字符串将采用的确切格式。是的,如果你能发布一些代码,那就太好了!@Enigma解析cookie头使用:有人做到了吗?我尝试过这样做,但cookie从未设置expires标记。另外,当你调用removeExpirecookies时,cookieandroid中是否有任何cookie解析器可以帮助我们做到这一点?或者我们应该只做split()还有我们自己?@Enigma阅读RFC,它描述了cookie字符串将采用的确切格式。是的,如果你能发布一些代码,那就太好了!@Enigma解析cookie头使用:有人做到了吗?我尝试过这样做,但cookie从未设置expires标记。另外,当你调用removeExpirecookies时,cookiee保持不变。您的答案中的“Expires”部分救了我一天。谢谢。根据我所做的研究,似乎您需要在调用setCookie()时提供域和路径.仅传入域对我来说不起作用,而且我找不到一种方法来获取给定域的Cookie路径——只是名称和值。在示例代码中,为什么过期日期是在将来?是的,我想你也可以将日期设为过去。谢谢@TomKincaid,你的建议也帮了我一把。顺便说一句,我们不再需要Coo了kieSyncManager作为webview将自行执行同步。它在API级别21中已被弃用。请在此处阅读更多…“Expires”您的部分回答拯救了我的一天。谢谢。根据我所做的研究,似乎您需要在调用setCookie()时提供域和路径.仅传入域对我来说不起作用,而且我找不到一种方法来获取给定域的Cookie路径——只是名称和值。在示例代码中,为什么过期日期是在将来?是的,我想你也可以将日期设为过去。谢谢@TomKincaid,你的建议sav
private static void deleteWebViewCookiesForDomain(Context context, String domain, boolean secure) {
    CookieSyncManager csm = CookieSyncManager.createInstance(context);
    CookieManager cm = CookieManager.getInstance();

    /* http://code.google.com/p/android/issues/detail?id=19294 */
    if (AndroidUtils.SDK_INT >= 11) {
        // don't trim leading '.'s
    } else {
        /* Trim leading '.'s */
        if (domain.startsWith(".")) domain = domain.substring(1);
    }

    /* Cookies are stored by domain, and are not different for different schemes (i.e. http vs
     * https) (although they do have an optional 'secure' flag.) */
    domain = "http" + (secure ? "s" : "") + "://" + domain;
    String cookieGlob = cm.getCookie(domain);
    if (cookieGlob != null) {
        String[] cookies = cookieGlob.split(";");
        for (String cookieTuple : cookies) {
            String[] cookieParts = cookieTuple.split("=");

            /* setCookie has changed a lot between different versions of Android with respect to
             * how it handles cookies like these, which are set in order to clear an existing
             * cookie.  This way of invoking it seems to work on all versions. */
            cm.setCookie(domain, cookieParts[0] + "=;");

            /* These calls have worked for some subset of the the set of all versions of
             * Android:
             * cm.setCookie(domain, cookieParts[0] + "=");
             * cm.setCookie(domain, cookieParts[0]); */
        }
        csm.sync();
    }
}