Cookies и Webview — CookieSyncManager в Android!

#android #http #cookies #login #webview

#Android #http #файлы cookie #аутентификация #webview

Вопрос:

У меня есть действие, которое позволяет вам войти на страницу. В следующем действии он должен отобразить веб-страницу на основе cookie, если вход в систему был успешным. Файл cookie восстановлен, и я пытаюсь поместить его в WebView с помощью следующего кода:

     Cookie sessionCookie = LoginWebView.cookie;
    CookieSyncManager.createInstance(webview.this);
    CookieManager cookieManager = CookieManager.getInstance();
    if (sessionCookie != null) {
                        cookieManager.removeSessionCookie();
        String cookieString = sessionCookie.getName()   "="   sessionCookie.getValue()   "; domain="   sessionCookie.getDomain();
        Log.v(TAG, "COOKIE SYNC: "   cookieString);
        cookieManager.setCookie(domain, cookieString);
        CookieSyncManager.getInstance().sync();

    }

    webView.setWebViewClient(new MyWebViewClient ());
    webView.loadUrl("http://a_page.com/getpageiphone.aspx?p=home");
  

Это явно основано на коде из других вопросов здесь, в StackOverflow, но когда я загружаю веб-страницу, похоже, это не работает. Кажется, что с моим кодом что-то не так, но я не вижу, где, и я начинаю думать, что делаю что-то очень неправильное.

Комментарии:

1. я думаю, вам, возможно, придется указать путь к файлу cookie в вашей строке cookie. добавить «; Path=» sessionCookie.getPath();

Ответ №1:

Вы использовали эту строку —

  if (sessionCookie != null) {
                          cookieManager.removeSessionCookie();

  }
  

.
Чтобы гарантировать, что вы получаете новые cookie каждый раз.

Похоже, вы столкнулись с той же проблемой, что и я, проверьте ссылку ниже —

Устраняет проблему с Sessioncookie () в Android (code.google.com )

в нем говорится, что это removeSessionCookie() реализовано в потоке, поэтому всякий раз, когда он вызывается; поток запускается, и после вашего setCookie(url, cookieString); вызова он удаляет новый cookie, который вы только что установили. Таким образом, для некоторых устройств он работает хорошо, поскольку removeSessionCookie() уже выполнен, в то время как для некоторых он удаляет cookie, и мы получаем эту проблему.

используя SystemClock.sleep(500); , вы просто дали системе сначала завершить removeSessionCookie()

Я предлагаю вам удалить это removeSessionCookie(); , поскольку вы устанавливаете только один файл cookie, чтобы он не конфликтовал с другими файлами cookie. Ваш код будет работать без проблем.

Комментарии:

1. У меня тоже была похожая проблема; кажется, removeSessionCookie запускается параллельно, чтобы удалить недавно добавленный файл cookie. Спасибо за этот ответ.

2. Рад, что время, которое я вложил в эту проблему, помогло вам.

Ответ №2:

Прежде всего, обязательно прочитайте значения заголовка, которые выдает вам ваш веб-сайт. Вы можете определить это с помощью Wireshark.

Во-вторых, когда вы знаете, как выглядят cookie-файлы (на основе ваших значений Wireshark), вы должны попытаться достичь тех же значений в своем коде. Обязательно отладьте значения cookie и внесите коррективы в сам файл cookie, если он не совпадает.