Подтвердить что ты не робот

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 ", ни одна из них не работает. Пожалуйста помоги.

4b9b3361

Ответ 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);
}

Конечно, если вам нужно упорствовать в этих куках, вам придется делать это и сохранить свое значение где-то для дальнейшего использования...

Ответ 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);