Android CookieManager setCookie ничего не устанавливает
в моем приложении, я получаю два файла cookie из запроса HttpGet и сохраняю их в 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. Когда я говорю, что они не установлены, я имею в виду, что hasCookies() возвращает false, а getCookie() возвращает null, когда я указываю URL.
Я пробовал все возможные комбинации для URL-адреса Cookie при вызове setCookie: "http://alpha.mydomainname.com", "http://www.mydomainname.com", "http://mydomainname.com" "," mydomainname.com "," alpha.mydomainname.com ",".mydomainname.com "," www.mydomainname.com ", ни одна из них не работает. Пожалуйста помоги.
Ответы
Ответ 1
Недавно у меня была аналогичная проблема, и для меня работало следующее решение. Я создаю/получаю экземпляры 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();
}
Ответ 2
Я также столкнулся с каким-то странным поведением с CookieManager
, в итоге у меня получилось решение, которое является обходным путем, но оно работает.
Вместо использования CookieManager
я просто использовал заголовки файлов cookie http, поэтому, например, с помощью 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);
}
Конечно, если вам нужно упорствовать в этих куках, вам придется делать это и сохранить свое значение где-то для дальнейшего использования...
Ответ 3
Я нашел плагин, который использует фоновый поток для установки файлов cookie.
Протестировано на iOS 9 и Android 5:
https://github.com/kristianhristov/cordova-cookie-master
Ответ 4
Куки файл не может содержать точку с запятой, вызывать точку с запятой - разделитель int cookie.
Ответ 5
Я столкнулся с той же проблемой. Не очень понятно, как использовать метод 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")
Ответ 6
Для меня сработал способ, предложенный Джеком-Грифом.
Но с одним замечанием домен должен быть ".someHost.com" или просто "somehost.com"
Ответ 7
В будущем. Я тестировал это на S7 с Android 7 и Moto X с Android 5
// base domain
String domain = "http://www.cudomor.com";
// get instance
CookieManager cookieManager = CookieManager.getInstance();
// just to check current cookies on debug mode
String currentCookies = cookieManager.getCookie(domain);
Log.e("cookieTag", currentCookies);
// just in case...
cookieManager.setAcceptCookie(true);
// in my test, was not necessary put domain or expire or path, just this
String cookieString = "cookieName=" + "cookieValue";
// setCookie add or update the cookie
cookieManager.setCookie(domain, cookieString);