5

Android は CookieManager を使用して Cookie を管理します。しかし、Cookie を削除するメソッド「removeAllCookies()」は 1 つしかなく、これによりすべての Cookie が削除されました。指定した URL に関連付けられた Cookie のみを削除したいのですが、他の Cookie は削除されません。この状況で、どうすればよいでしょうか?

4

3 に答える 3

2

1、Android はこのインターフェイスをサポートしていません。

2、私たちのプロジェクトでの回避策。

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

注: 一部の Android バージョン (正確なバージョン番号はありません。私の経験では Android 2.3 です) では、システムは Cookie ドメインとしてホストを使用し、一方でシステムは「.」を使用します。+ Cookie ドメインとしてホストします。したがって、より良い方法は、両方を明確にすることです。

于 2013-05-31T03:11:38.607 に答える
0

Lollipop より前のバージョンでは、他の 2 つの回答が機能します。新しいバージョンでは、以下を置き換える必要があります:

sCookieSyncManager.sync();

と:

sCookieManager.flush();
于 2019-03-19T23:44:23.963 に答える