Android 如何使用CookieManager删除特定域的Cookie?
我知道存在,但如何仅删除域的CookieAndroid 如何使用CookieManager删除特定域的Cookie?,android,cookies,webkit,Android,Cookies,Webkit,我知道存在,但如何仅删除域的Cookie 有人能帮我写一些代码片段吗?我在API中看不到这样做的方法,但是你可以一直深入研究真正的源代码(开源很好)。。。例如,我在这个类中发现了这个deleteCookies方法:它是Android核心的一部分 如你所见。。。Cookie只是SQLite数据库中的行。。。因此,如果你能让这个类工作,至少你知道如何自己去做。我在API中看不到这样做的方法,但你总是可以深入研究真正的源代码(开源很好)。。。例如,我在这个类中发现了这个deleteCookies方法:
有人能帮我写一些代码片段吗?我在API中看不到这样做的方法,但是你可以一直深入研究真正的源代码(开源很好)。。。例如,我在这个类中发现了这个
deleteCookies
方法:它是Android核心的一部分
如你所见。。。Cookie只是SQLite数据库中的行。。。因此,如果你能让这个类工作,至少你知道如何自己去做。我在API中看不到这样做的方法,但你总是可以深入研究真正的源代码(开源很好)。。。例如,我在这个类中发现了这个
deleteCookies
方法:它是Android核心的一部分
如你所见。。。Cookie只是SQLite数据库中的行。。。因此,如果你能让这个类工作,至少你知道如何自己做。调用android.webkit.CookieManager的
getCookie
方法为你感兴趣的URL或域生成RFC2109Cookie
头。解析cookie头以获取cookie名称列表。对于每个cookie名称,为该名称生成一个RFC 2109Set cookie
头,该名称的过期日期在过去,并将其传递到CookieManager
的setCookie
方法中。尽管API文档指定setCookie
忽略已过期的值,但在这种情况下,Android当前的实现实际上会刷新cookie。为了防止将来的实现忽略文档中指定的过期值,检查Cookie是否已实际删除,如果CookieManager未执行,则执行一些回退行为-removeAllCookie
方法可能对此回退有用。调用android.webkit.CookieManager
的getCookie
方法为URL或URL生成RFC2109Cookie
头你感兴趣的领域。解析cookie头以获取cookie名称列表。对于每个cookie名称,为该名称生成一个RFC 2109Set 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;ipublic 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();
}
}