2012-08-12 10 views
5

Android verwenden CookieManager, um Cookies zu verwalten. Aber es gibt nur eine Methode 'removeAllCookies()', um Cookies zu entfernen, und dadurch wurden alle Cookies gelöscht. Jetzt möchte ich einen Cookie entfernen, der nur einer bestimmten URL zugeordnet ist, und andere Cookies werden nicht entfernt. Wie kann ich in dieser Situation tun?Android WebView removeCookie

Antwort

4

Ich habe einige kleine Änderungen in @ Summerxiaqings Antwort gemacht und ich habe überprüft, ob es funktioniert. (Hinzugefügt https, geändert leeren Scheck an TextUtils.isEmpty verabschiedete Cookie durch Argument)

 public static void clearCookieByUrl(String url, CookieManager pCookieManager, CookieSyncManager pCookieSyncManager) { 
     Uri uri = Uri.parse(url); 
     String host = uri.getHost(); 
     clearCookieByUrlInternal(url,pCookieManager,pCookieSyncManager); 
     clearCookieByUrlInternal("http://." + host,pCookieManager,pCookieSyncManager); 
     clearCookieByUrlInternal("https://." + host,pCookieManager,pCookieSyncManager); 
    } 

    private static void clearCookieByUrlInternal(String url, CookieManager pCookieManager, CookieSyncManager pCookieSyncManager) { 
     if (TextUtils.isEmpty(url)) { 
      return; 
     } 
     String cookieString = pCookieManager.getCookie(url); 
     Vector<String> cookie = getCookieNamesByUrl(cookieString); 
     if (cookie == null || cookie.isEmpty()) { 
      return; 
     } 
     int len = cookie.size(); 
     for (int i = 0; i < len; i++) { 
      pCookieManager.setCookie(url, cookie.get(i) + "=-1"); 
     } 
     pCookieSyncManager.sync(); 
    } 

    private static Vector<String> getCookieNamesByUrl(String cookie) { 
     if (TextUtils.isEmpty(cookie)) { 
      return null; 
     } 
     String[] cookieField = cookie.split(";"); 
     int len = cookieField.length; 
     for (int i = 0; i < len; i++) { 
      cookieField[i] = cookieField[i].trim(); 
     } 
     Vector<String> allCookieField = new Vector<String>(); 
     for (int i = 0; i < len; i++) { 
      if (TextUtils.isEmpty(cookieField[i])) { 
       continue; 
      } 
      if (!cookieField[i].contains("=")) { 
       continue; 
      } 
      String[] singleCookieField = cookieField[i].split("="); 
      allCookieField.add(singleCookieField[0]); 
     } 
     if (allCookieField.isEmpty()) { 
      return null; 
     } 
     return allCookieField; 
    } 

Im Inneren der Aktivität

mContext = getApplicationContext(); 
CookieManager mCookieManager = CookieManager.getInstance(); 
CookieSyncManager mCookieSyncManager = CookieSyncManager.createInstance(mContext); 
clearCookieByUrl("http://example.com", mCookieManager, mCookieSyncManager); 
1

1, Android haben diese Schnittstelle nicht unterstützt.

2, eine Arbeit in unserem Projekt.

sCookieManager = CookieManager.getInstance(); 

public static void clearCookieByUrl(String url) { 

    Uri uri = Uri.parse(url); 
    String host = uri.getHost(); 
    clearCookieByUrlInternal(url); 
    clearCookieByUrlInternal("http://." + host); 
    } 

/** 
    * clear cookie by url 
    * @param url 
    */ 
    private static void clearCookieByUrlInternal(String url) { 
    if (Utils.isStringEmpty(url)) { 
     return; 
    } 
    String cookieString = sCookieManager.getCookie(url); 
    Vector<String> cookie = getCookieNamesByUrl(cookieString); 
    if (cookie == null || cookie.isEmpty()) { 
     return; 
    } 
    int len = cookie.size(); 
    for (int i = 0; i < len; i++) { 
     sCookieManager.setCookie(url, cookie.get(i) + "=-1"); 
    } 
    sCookieSyncManager.sync(); 
    } 

private static Vector<String> getCookieNamesByUrl(String cookie) { 
    if (Utils.isStringEmpty(cookie)) { 
     return null; 
    } 
    String[] cookieField = cookie.split(";"); 
    int len = cookieField.length; 
    for (int i = 0; i < len; i++) { 
     cookieField[i] = cookieField[i].trim(); 
    } 
    Vector<String> allCookieField = new Vector<String>(); 
    for (int i = 0; i < len; i++) { 
     if (Utils.isStringEmpty(cookieField[i])) { 
     continue; 
     } 
     if (!cookieField[i].contains("=")) { 
     continue; 
     } 
     String[] singleCookieField = cookieField[i].split("="); 
     allCookieField.add(singleCookieField[0]); 
    } 
    if (allCookieField.isEmpty()) { 
     return null; 
    } 
    return allCookieField; 
    } 

Hinweis: In einiger Android-Version (ich habe nicht die genaue Versionsnummer, meine Erfahrung ist Android 2.3), wird das System Host als Cookie-Domain verwenden, und auf der anderen Seite, wird das System verwenden‘. " + host als Cookie-Domäne. Ein besserer Weg ist für beide klar.