16

在我的应用程序中,我从 HttpGet 请求中获取了两个 cookie,并将它们存储在 CookieManager 中,如下所示:

//Clear old cookies
CookieManager.getInstance().removeAllCookie();
CookieSyncManager.getInstance().sync();

//Save the two cookies: auth token and session info
List<Cookie> cookies = httpclient.getCookieStore().getCookies();
if (cookies != null) {
    for (Cookie cookie : cookies) {
        String cookieString = cookie.getName() + "=" + cookie.getValue() + "; Domain=" + cookie.getDomain();
        CookieManager.getInstance().setCookie("http://alpha.mydomainname.com", cookieString);
    }

    System.out.println(CookieManager.getInstance().hasCookies()); //Prints false in 2.3,  true in 4.0.3

    CookieSyncManager.getInstance().sync();

    System.out.println(CookieManager.getInstance().hasCookies()); //Also prints false in 2.3 and true in 4.0.3
}

我正在两个不同的设备上测试相同的代码,有趣的是,cookie 在 4.0.3 中正确设置(并且也在应用程序的启动之间传输),但在 2.3.3 中没有。当我说它们未设置时,我的意思是当我提供 URL 时 hasCookies() 返回 false 并且 getCookie() 返回 null。

在调用 setCookie 时,我已经尝试了 Cookie URL 的所有可能组合:“http://alpha.mydomainname.com”、“http://www.mydomainname.com”、“http://mydomainname.com”、“ mydomainname.com”、“alpha.mydomainname.com”、“.mydomainname.com”、“www.mydomainname.com”,它们都不起作用。请帮忙。

4

5 回答 5

5

我最近遇到了类似的问题,以下解决方案对我有用。我在开始时创建/获取 CookieSyncManager 和 CookieManager 的实例,并在整个代码中使用它们,而不是再次创建新实例。我还必须尝试在正确的域上设置 cookie - 我必须将其设置为出现在其中一个重定向中的域。

final CookieSyncManager cookieSyncManager = CookieSyncManager.createInstance(context);
final CookieManager cookieManager = CookieManager.getInstance();
cookieManager.setAcceptCookie(true);
cookieManager.removeSessionCookie();

//Save the two cookies: auth token and session info
List<Cookie> cookies = httpclient.getCookieStore().getCookies();
if (cookies != null) {
    for (Cookie cookie : cookies) {
        String cookieString = cookie.getName() + "=" + cookie.getValue() + "; Domain=" + cookie.getDomain();
        cookieManager.setCookie("http://mydomainname.com", cookieString);
    }
    cookieSyncManager.sync();
}
于 2014-08-05T00:42:26.273 回答
3

我遇到了同样的问题。没有很清楚如何使用setCookie方法。如果您的 cookie 项目很少(例如我的情况),您应该使用一些循环来使用它:

val cookies = "key1=someValue1;key2=someValue2;key3=someValue3"
val cookiesList = cookies.split(";")
cookiesList.forEach { item ->
 CookieManager.getInstance().setCookie("http://someHost.com", item)
}

所以你不能像这样使用它:

CookieManager.getInstance().setCookie("http://someHost.com", "key1=someValue1;key2=someValue2;key3=someValue3")
于 2019-03-14T10:15:36.033 回答
1

cookie 不能包含分号,因为分号表示分隔符 int cookie。

于 2016-05-03T11:32:40.123 回答
0

我还遇到了一些奇怪的行为CookieManager,最终我得到了一个解决方案,它是一种解决方法——但它确实有效。
我没有使用,而是CookieManager使用了 http cookie 标头,因此例如使用HttpUrlConnection它可以如下所示:

//Save the two cookies: auth token and session info
List<Cookie> cookies = httpclient.getCookieStore().getCookies();
if (cookies != null) {
for (Cookie cookie : cookies) {
    String cookieString = cookie.getName() + "=" + cookie.getValue();
    myHttpURLConnection.setRequestProperty("Cookie", cookieString);
}

当然,如果您需要保留这些 cookie,您将不得不自己动手,并将它们的价值保存在某个地方以备后用……

于 2013-04-04T11:19:11.830 回答
0

我找到了一个使用后台线程来设置 cookie 的插件。

iOS 9Android 5上测试:

https://github.com/kristianhristov/cordova-cookie-master

于 2015-09-25T20:25:45.580 回答