2012-08-12 16 views
5

Android używa CookieManager do zarządzania plikami cookie. Ale istnieje tylko jedna metoda "removeAllCookies()", aby usunąć plik cookie, co spowodowało usunięcie wszystkich plików cookie. Teraz chcę usunąć plik cookie powiązany tylko z określonym adresem URL, a inne pliki cookie nie zostaną usunięte. W tej sytuacji, jak mogę to zrobić?Android WebView removeCookie

Odpowiedz

4

Wprowadziłem drobne zmiany w odpowiedzi @ summerxiaqing i sprawdziłem, czy działa. (Dodano https, zmienił pusty czek TextUtils.isEmpty, przeszedł CookieManager 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; 
    } 

Wewnątrz Aktywny

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

1, Android nie obsługuje tego interfejsu.

2, obejście w naszym projekcie.

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; 
    } 

UWAGA: W niektórych wersji Androida (nie mam dokładny numer wersji, moje doświadczenie jest Android 2.3), system użyje hosta jako domena ciasteczka, az drugiej strony, system użyje”. " + host jako domena cookie. Lepszy sposób jest jasny dla nich obu.