安卓Cookie管理器setCookie创建多个Cookie



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

但当我尝试使用CookieManager.setCookie时,该域的所有可用Cookie都没有删除。当我试图向多个cookie密钥写入时,会出现多个cookie键。

我在下面附上我的代码。您可以在评论行中找到结果。故事的最后,我得到了这个饼干。注意多个值:

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

我得到了礼物饼干:

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

然后我打电话来换旧饼干。

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。

请尝试实现此解决方案。它将使您能够将想要的Cookieflushremove,然后您可以根据需要再次设置。

祝你好运!

  1. 首先,我们可以通过CookieManager的接口删除cookie:

    setCookie(URL, 'COOKIE_KEY=;');
    
  2. 然后,我们需要找到正确的URL,同时考虑cookie的路径属性。

    例如,以下cookie

    document.cookie = 'COOKIE_NAME=COOKIE_VAL; path=/; domain=.example.com;'
    

    可以被删除

    setCookie('.example.com', 'COOKIE_NAME=;')
    

    并且不能被删除

    setCookie('www.example.com/info.html', 'COOKIE_NAME=;')
    
  3. 最后,这里有一个删除cookie的示例。

    String[] kvPairs = CookieManager.getInstance().getCookie(url).split(" ");           
    for (String kvPair : kvPairs) {
    String newPair = kvPair.replaceAll("=.*", "=;");
    // Delete the cookie asynchronously.
    CookieManager.getInstance().setCookie(url, newPair);
    }
    

最新更新