2012-08-12 36 views
5

Android sử dụng CookieManager để quản lý cookie. Nhưng chỉ có một phương thức 'removeAllCookies()' để xóa cookie và điều này đã xóa tất cả cookie. Bây giờ tôi muốn xóa cookie chỉ được liên kết với một url được chỉ định và các cookie khác không bị xóa. Trong tình huống này, làm sao tôi có thể làm được?Android WebView removeCookie

Trả lời

4

Tôi đã thực hiện một số thay đổi nhỏ trong câu trả lời của @ summerxiaqing và tôi đã kiểm tra nó hoạt động. (Added https, thay đổi séc trống để TextUtils.isEmpty, thông qua CookieManager bởi lập luận)

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

Bên trong Hoạt động

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

1, Android chưa hỗ trợ giao diện này.

2, Công việc xung quanh trong dự án của chúng tôi.

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

LƯU Ý: Trong một số phiên bản android (tôi không có số phiên bản chính xác, kinh nghiệm của tôi là android 2.3) sẽ sử dụng máy chủ làm tên miền cookie. ' + lưu trữ dưới dạng tên miền cookie. Vì vậy, một cách tốt hơn là rõ ràng cả hai.