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