在我的应用程序中,我从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
}
Run Code Online (Sandbox Code Playgroud)
我在两个不同的设备中测试相同的代码,有趣的是,在4.0.3中正确设置了cookie(并且在应用程序的启动之间也是如此),而不是在2.3.3中.当我说它们没有设置时,我的意思是hasCookies()返回false,并且当我提供URL时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",它们都不起作用.请帮忙.
小智 8
我也遇到过同样的问题。目前还不太清楚如何使用该setCookie方法。如果你有一些带有 cookie 的项目(就像我的例子),你应该将它与一些循环一起使用:
val cookies = "key1=someValue1;key2=someValue2;key3=someValue3"
val cookiesList = cookies.split(";")
cookiesList.forEach { item ->
CookieManager.getInstance().setCookie("http://someHost.com", item)
}
Run Code Online (Sandbox Code Playgroud)
所以你不能像这样使用它:
CookieManager.getInstance().setCookie("http://someHost.com", "key1=someValue1;key2=someValue2;key3=someValue3")
Run Code Online (Sandbox Code Playgroud)
小智 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();
}
Run Code Online (Sandbox Code Playgroud)
我还遇到了一些奇怪的行为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);
}
Run Code Online (Sandbox Code Playgroud)
当然,如果您需要保留这些 cookie,您将必须自己完成并将它们的值保存在某处以供以后使用......