Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/208.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android CookieManager setCookie创建多个Cookie_Android_Mobile_Cookies - Fatal编程技术网

Android CookieManager setCookie创建多个Cookie

Android CookieManager setCookie创建多个Cookie,android,mobile,cookies,Android,Mobile,Cookies,在我的android应用程序中,我有一个webview。它从多个域加载URL。我需要删除特定域中的所有cookie。我想保留来自其他域的cookie。但是我需要删除一个域中的所有cookie。我对处理我的请求的所有其他解决方案持开放态度。(请注意,域同时使用http和https) 但是当我尝试使用CookieManager.setCookie时,该域的所有可用Cookie都没有被删除。当我尝试写入多个cookie键时,会出现多个cookie键 我在下面附上我的代码。您可以在注释行中找到结果。在故

在我的android应用程序中,我有一个webview。它从多个域加载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';"
My helper函数,用于拆分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;
}
然后我打电话来换旧饼干

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';"
}
Edit2:setCookie的签名如下:

mCookieManager.setCookie(url2, cookie.get(i) + "=-1;");
mCookieManager.setCookie(url2, cookie.get(i) + "=-1");
 /**
 * 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;memory_-check=0;userid='-1';token='-1';memory_-check='-1';“
),但它们会有不同的主机或路径吗?

我在Android中也有类似的体验。设置相同的cookie确实会将其添加为新cookie

请尝试实施。它将使您能够
清除
删除的cookie,然后您可以根据需要再次设置cookie

祝你好运

  • 首先,我们可以通过CookieManager的界面删除cookie:

     setCookie(URL, 'COOKIE_KEY=;');
    
  • 然后,我们需要找到正确的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=;')
    
    不能被删除

     setCookie('.example.com', 'COOKIE_NAME=;')
    
     setCookie('www.example.com/info.html', 'COOKIE_NAME=;')
    
  • 最后,这里是一个删除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);
     }
    

  • 我尝试过过期方法,但仍然没有成功。我后来打电话给removeExpiredCookie,Cookie仍然保持不变。另外,当您将expire添加到cookie值时,我认为setCookie会忽略它。