Android CookieManager setCookie 创建多个cookie

标签 android mobile cookies

在我的 android 应用程序中,我有一个 webview。它从多个域加载 URL。我需要删除特定域中的所有 cookie。我想保留来自其他域的 cookie。但是我需要从一个域中删除所有 cookie。我对处理我的请求的所有其他解决方案持开放态度。 (注意域名同时使用http和https)

但是当我尝试使用 CookieManager.setCookie 时,该域的所有可用 cookie 都没有被删除。当我尝试写入这些键时,会出现多个 cookie 键。

我在下面附上我的代码。您可以在注释行中找到结果。在故事的结尾,我得到了这个 cookies 。多个值的注意事项:

"userid=12%34; token=12ased; remember_check=0; userid='-1'; token='-1'; remember_check='-1';"

我的拆分 cookie 字符串以获取 cookie 键的辅助函数:

public static Vector<String> getCookieAllKeysByCookieString(String pCookies) {
    if (TextUtils.isEmpty(pCookies)) {
        return null;
    }
    String[] cookieField = pCookies.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;
}

我得到礼物 cookies :

// I take cookie string for specific URL
mCookieManager = CookieManager.getInstance();
String url2="https://mysite.com";
String cookieString = mCookieManager.getCookie(url2);
Toast.makeText(mContext, "cookie string:\n"+cookieString, Toast.LENGTH_SHORT).show();
// result is: userid=12%34; token=12ased; remember_check=0;

然后我打电话来更换旧 cookies 。

Vector<String> cookie = CookieUtil.getCookieAllKeysByCookieString(cookieString);
if (cookie == null || cookie.isEmpty()) {
    Toast.makeText(mContext, "cookie null", Toast.LENGTH_SHORT).show();
}
if (cookie != null) {
    int len = cookie.size();
    Toast.makeText(mContext, "cookie number: "+len, Toast.LENGTH_SHORT).show();
    // result is, cookie number: 3
    String cookieNames="";
    for (int i = 0; i < len; i++) {
        cookieNames += "\n"+cookie.get(i) ;
        mCookieManager.setCookie(url2, cookie.get(i) + "='-1';");
    }
    Toast.makeText(mContext, "cookieNames:\n"+cookieNames, Toast.LENGTH_SHORT).show();
    // result is: "cookienames: userid token remember_check"

    mCookieSyncManager.sync();

    cookieString = mCookieManager.getCookie(url2);
    Toast.makeText(mContext, "cookie string:\n"+cookieString, Toast.LENGTH_SHORT).show();
    mCookieSyncManager.sync();
    // result is: "userid=12%34; token=12ased; remember_check=0; userid='-1'; token='-1'; remember_check='-1';"
}

编辑:
我也试过这样的 setCookie:

mCookieManager.setCookie(url2, cookie.get(i) + "=-1;");
mCookieManager.setCookie(url2, cookie.get(i) + "=-1");

Edit2:setCookie的签名是这样的:

 /**
 * Sets a cookie for the given URL. Any existing cookie with the same host,
 * path and name will be replaced with the new cookie. The cookie being set
 * must not have expired and must not be a session cookie, otherwise it
 * will be ignored.
 *
 * @param url the URL for which the cookie is set
 * @param value the cookie as a string, using the format of the 'Set-Cookie'
 *              HTTP response header
 */
public void setCookie(String url, String value) {
    throw new MustOverrideException();
}

尽管我在 cookie 字符串中得到相同的键 ("userid=12%34; token=12ased; remember_check=0; userid='-1'; token='-1'; remember_check='-1' ;") 它们会有不同的主机或路径吗?

最佳答案

我对 CookieManager 也有类似的经历在安卓系统中。设置相同的 cookie 确实会将其添加为新的 cookie。

请尝试执行this solution .它将使您能够刷新您想要删除的cookie,然后您就可以根据需要重新设置。

祝你好运!

关于Android CookieManager setCookie 创建多个cookie,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20940012/

相关文章:

ios - 移动 Safari 中的网页是否可以检查是否选择了“设置”>“Safari”>“接受 Cookie 'From visited' 或 'Always'”?

python - 必须在您的浏览器中启用 Cookie [Python 请求]

java - 在 Android 中的模式上使用 OR

android - 如何在安卓设备上管理调试和发布版本?

android - 在方向改变时调用 onDestroy?

asp.net 移动/桌面站点切换按钮,切换主页,但样式 "stuck"

java - 我在哪里可以下载 Java comm api?

css - iframe 不调整大小!和工作响应

android - GreenDAO 与 Sqlcipher 集成示例

javascript - HTTP 访问控制 (CORS) 能否阻止其他域运行我的脚本?