2010-05-14 78 views

回答

9

致電android.webkit.CookieManagergetCookie方法爲您感興趣的URL或域生成RFC 2109 Cookie標頭。解析cookie標題以獲取cookie名稱列表。對於每個cookie名稱,爲該名稱生成一個RFC 2109 Set-Cookie標題,該標題的過期日期已過期,並將其傳遞到CookieManagersetCookie方法中。儘管API文檔指定setCookie忽略已過期的值,但在這種情況下,Android的當前實現實際上會刷新cookie。爲防止未來的實現忽略文檔中指定的過期值,請檢查cookie是否真的被刪除,並執行一些後備行爲,如果它們沒有 - CookieManagerremoveAllCookie方法可能對此回退有用。

+0

在android中有沒有可以幫助我們的cookie解析器?或者我們應該只是做split()和我們自己? – Enigma 2012-08-31 05:34:17

+0

@Enigma閱讀RFC,它描述了cookie字符串的確切格式。 – rpetrich 2012-09-04 01:16:23

+0

謝謝:)它的工作原理:) – Enigma 2012-09-04 06:59:26

1

我在API中並沒有看到這樣做,但你總是可以深入到真正的源代碼中(例如,我發現這個類的deleteCookies方法:WebViewDatabase其中是Android核心的一部分。

正如你可以看到那裏...... Cookie只是SQLite數據庫中的行...所以如果你能使這個類工作,至少你知道如何通過你自己做到這一點。

+0

我知道這是有點老了,但我正在尋找這個自己。如果我自己修改webview.db數據庫,是否有可能發生衝突?如果CookieSyncManager或WebView在修改它時訪問它,是否存在線程安全和鎖定問題? – cottonBallPaws 2011-04-07 17:57:38

11
public void clearCookies(String domain) { 
    CookieSyncManager.createInstance(this); 
    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"); 
    } 
    CookieSyncManager.getInstance().sync(); 
} 
+0

「過期」部分答案拯救了我的一天。謝謝。 – trante 2014-08-08 21:47:53

+3

從我做過的研究看來,您需要在調用setCookie()時提供域和路徑。單獨傳遞域名對我來說不起作用,而且我無法找到獲取給定域的Cookie路徑的方法 - 只是名稱和值。 – markproxy 2014-11-11 23:15:19

+0

在示例代碼中,爲什麼未來會過期? – 2016-04-28 02:24:59

3

這是來自開源項目的代碼示例。也許可以幫助某人。

https://github.com/janrain/engage.android/blob/96f21b45738ef82a911e27d8a707aff3a1024d36/Jump/src/com/janrain/android/utils/WebViewUtils.java

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(); 
    } 
} 
+0

它是如何工作的? – Robert 2015-05-13 08:31:02

+0

就我而言,我只需要確保域名是正確的(以「。」開頭),它會將所有cookie值重置爲空字符串。效果很好。 – Meng 2015-05-13 08:47:38

+0

我覺得這個功能有問題。在我爲「twitter.com」和「api.twitter.com」執行後,Twitter不再加載(Android模擬器6.0上的空白頁面)。但是,它適用於Facebook。 – 2017-07-24 12:19:46