kzen.dev
  • Вопросы
  • Метки
  • Пользователи
Оповещения
Вознаграждения
Регистрация
После регистрации, сможете получать уведомления об ответах и комментариях на Ваши вопросы.
Вход
Если у Вас уже есть аккаунт, войдите чтобы проверить новые уведомления.
Тут будут вознаграждения за добавленные вопросы, ответы и комментарий.
Дополнительно
Источник
Редактировать
 quietmint
quietmint
Вопрос

Передача файлов cookie из HttpURLConnection (java.net.CookieManager) в WebView (android.webkit.CookieManager)

Я'видел ответы о том, как это должно работать со старым DefaultHttpClient но там нет хорошего примера для HttpURLConnection.

Я использую HttpURLConnection для выполнения запросов к веб-приложению. В начале моего Android-приложения я использую CookieHandler.setDefault(new CookieManager()) для автоматической работы с сессионными куками, и это работает нормально.

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

Как мне скопировать куки из java.net.CookieManager, используемого HttpURLConnection, в android.webkit.CookieManager, используемый WebView, чтобы я мог разделить сессию?

30 2012-10-04T16:00:24+00:00 4
Программирование
android
cookies
single-sign-on
httpurlconnection
android-webview
 talkol
talkol
6-го августа 2013 в 2:02
2013-08-06T02:02:22+00:00
Дополнительно
Источник
Редактировать
#17374860

Я хотел бы предложить совершенно другой подход к решению вашей проблемы. Вместо того, чтобы копировать куки из одного места в другое (ручная синхронизация), давайте заставим HttpURLConnection и WebViews использовать одно и то же хранилище куки.

Это полностью устранит необходимость в синхронизации. Любой cookie, обновленный в одном из них, будет немедленно и автоматически отражен в другом.

Для этого создайте свою собственную реализацию java.net.CookieManager, которая перенаправляет все запросы к WebViews' webkit android.webkit.CookieManager.

Реализация:

import java.io.IOException;
import java.net.CookieManager;
import java.net.CookiePolicy;
import java.net.CookieStore;
import java.net.URI;
import java.util.Arrays;
import java.util.List;
import java.util.Map;

public class WebkitCookieManagerProxy extends CookieManager 
{
    private android.webkit.CookieManager webkitCookieManager;

    public WebkitCookieManagerProxy()
    {
        this(null, null);
    }

    WebkitCookieManagerProxy(CookieStore store, CookiePolicy cookiePolicy)
    {
        super(null, cookiePolicy);

        this.webkitCookieManager = android.webkit.CookieManager.getInstance();
    }

    @Override
    public void put(URI uri, Map<String, List<String>> responseHeaders) throws IOException 
    {
        // make sure our args are valid
        if ((uri == null) || (responseHeaders == null)) return;

        // save our url once
        String url = uri.toString();

        // go over the headers
        for (String headerKey : responseHeaders.keySet()) 
        {
            // ignore headers which aren't cookie related
            if ((headerKey == null) || !(headerKey.equalsIgnoreCase("Set-Cookie2") || headerKey.equalsIgnoreCase("Set-Cookie"))) continue;

            // process each of the headers
            for (String headerValue : responseHeaders.get(headerKey))
            {
                this.webkitCookieManager.setCookie(url, headerValue);
            }
        }
    }

    @Override
    public Map<String, List<String>> get(URI uri, Map<String, List<String>> requestHeaders) throws IOException 
    {
        // make sure our args are valid
        if ((uri == null) || (requestHeaders == null)) throw new IllegalArgumentException("Argument is null");

        // save our url once
        String url = uri.toString();

        // prepare our response
        Map<String, List<String>> res = new java.util.HashMap<String, List<String>>();

        // get the cookie
        String cookie = this.webkitCookieManager.getCookie(url);

        // return it
        if (cookie != null) res.put("Cookie", Arrays.asList(cookie));
        return res;
    }

    @Override
    public CookieStore getCookieStore() 
    {
        // we don't want anyone to work with this cookie store directly
        throw new UnsupportedOperationException();
    }
}

и, наконец, использовать его, сделав это при инициализации вашего приложения:

android.webkit.CookieSyncManager.createInstance(appContext);
// unrelated, just make sure cookies are generally allowed
android.webkit.CookieManager.getInstance().setAcceptCookie(true);

// magic starts here
WebkitCookieManagerProxy coreCookieManager = new WebkitCookieManagerProxy(null, java.net.CookiePolicy.ACCEPT_ALL);
java.net.CookieHandler.setDefault(coreCookieManager);
 talkol
talkol
Редактировал ответ 6-го августа 2013 в 2:09
51
0
Решение / Ответ
 quietmint
quietmint
4-го октября 2012 в 4:00
2012-10-04T16:00:24+00:00
Дополнительно
Источник
Редактировать
#17374859

По сравнению с DefaultHttpClient, здесь есть несколько дополнительных шагов. Ключевое отличие заключается в том, как получить доступ к существующим cookies в HTTPURLConnection:

  1. Вызвать CookieHandler.getDefault() и привести результат к java.net.CookieManager.
  2. С помощью менеджера cookie вызовите getCookieStore() для доступа к хранилищу cookie.
  3. Вызовите get() для доступа к списку файлов cookie для заданного URI.

Вот полный пример:

@Override
protected void onCreate(Bundle savedInstanceState) {
    // Get cookie manager for WebView
    // This must occur before setContentView() instantiates your WebView
    android.webkit.CookieSyncManager webCookieSync =
        CookieSyncManager.createInstance(this);
    android.webkit.CookieManager webCookieManager =
        CookieManager.getInstance();
    webCookieManager.setAcceptCookie(true);

    // Get cookie manager for HttpURLConnection
    java.net.CookieStore rawCookieStore = ((java.net.CookieManager)
        CookieHandler.getDefault()).getCookieStore();

    // Construct URI
    java.net.URI baseUri = null;
    try {
        baseUri = new URI("http://www.example.com");
    } catch (URISyntaxException e) {
        // Handle invalid URI
        ...
    }

    // Copy cookies from HttpURLConnection to WebView
    List<HttpCookie> cookies = rawCookieStore.get(baseUri);
    String url = baseUri.toString();
    for (HttpCookie cookie : cookies) {
        String setCookie = new StringBuilder(cookie.toString())
            .append("; domain=").append(cookie.getDomain())
            .append("; path=").append(cookie.getPath())
            .toString();
        webCookieManager.setCookie(url, setCookie);
    }

    // Continue with onCreate
    ...
}
18
0
 Chani
Chani
18-го октября 2013 в 12:15
2013-10-18T00:15:09+00:00
Дополнительно
Источник
Редактировать
#17374861

Я волшебным образом решил все свои проблемы с cookie с помощью одной строки в onCreate:

CookieHandler.setDefault(new CookieManager());.

11
0
 Christian
Christian
28-го ноября 2014 в 9:14
2014-11-28T09:14:24+00:00
Дополнительно
Источник
Редактировать
#17374862

У меня была такая же проблема, и это мое решение :

Сразу после входа в систему (он's важно, потому что и прежде, вы можете быть Дон'Т есть печенье еще), используя httpurlconnection пост (после getResponseCode), я делаю :

 responseCode = connexion.getResponseCode();
 if (responseCode == HttpURLConnection.HTTP_OK) {
     final String COOKIES_HEADER = "Set-Cookie";
     cookie = connexion.getHeaderField(COOKIES_HEADER);
     ...
 }

(где печенье является публичной строку в моем классе)

И в своей деятельности объект WebView, где я хочу, чтобы отобразить веб-страницы с сервера, используя WebView, что я делаю :

    String url = "http://toto.com/titi.html";        // the url of the page you want to display
    CookieSyncManager.createInstance(getActivity());
    CookieSyncManager.getInstance().startSync();
    android.webkit.CookieManager cookieManager = android.webkit.CookieManager.getInstance();
    cookieManager.setAcceptCookie(true);
    cookieManager.removeSessionCookie();
    cookieManager.setCookie(url, cookie);
    CookieSyncManager.getInstance().sync();

Как мой WebView это в фрагмент, мне пришлось использовать getActivity() для контекста, я также должен был указать андроид.в WebKit. прежде чем cookiemanager, как в противном случае он не может быть решен (импорт java.net вместо Android.менеджер в WebKit печенье).

cookie-это та же строка, что и выше (в моем фрагмент, я должен был восстановить его с помощью :

    cookie = getArguments().getString(COOKIE);

и в мой класс MainActivity, я пошлю его :

    Bundle arg = new Bundle();
    arg.putString(Fragment_Cameras.COOKIE, cookie);
    fragment.setArguments(arg);

Я надеюсь, что это может помочь !

-2
0
Похожие сообщества 18
Mobile Dev Jobs — вакансии и аналитика
Mobile Dev Jobs — вакансии и аналитика
19 732 пользователей
Публикуем вакансии и запросы на поиск работы по направлению iOS, Android, Xamarin и т.д. Размещение бесплатное. 📌 ВАЖНО: Правила публикации и правила канала: 📌 Ссылка – https://telegra.ph/Pravila-oformleniya-vakansij-i-rezyume-12-10
Открыть telegram
StartAndroid Ru Chat
StartAndroid Ru Chat
2 849 пользователей
Android чат сайта startandroid.ru Канал - @startandroid
Открыть telegram
Android Architecture
Android Architecture
2 750 пользователей
Русскоязычный чат для обсуждения архитектуры Android приложений. У нас атмосфера взаимопомощи и уважения друг к другу! Общий чат по Android: @android_ru Чат для вакансий: @mobile_jobs Подробнее: https://telegra.ph/Android-Architecture-06-02
Открыть telegram
Android Declarative
Android Declarative
1 780 пользователей
Чат русскоязычного android-сообщества, посвященный декларативным UI-фреймворкам: Jetpack Compose, Anko, Anvil, Litho, Splitties за оффтопик пожизненная ссылка в @android_ru @jetpack_compose - новости https://bit.ly/32pRDWm - примеры компонентов
Открыть telegram
AndroidDev :: Разработка. It's Android time now!
AndroidDev :: Разработка. It's Android time now!
1 684 пользователей
Чат разработчиков Android. Вакансии, резюме и информацию о митапах размещать можно 1раз в 2 недели ставьте в тексте тег #vacancy. Публикацию скрытой и явной рекламы ваших каналов и сайтов после получения разрешения от @olegushakov Флудить тут @pogromista
Открыть telegram
Android ROM Development
Android ROM Development
1 649 пользователей
Discussion about Android ROM development and testing. App development group: 🖥 https://t.me/joinchat/CiGS0z9LkBPQ_8gjz3eAdA
Открыть telegram
Добавить вопрос
Категории
Все
Технологий
Культура / Отдых
Жизнь / Искусство
Наука
Профессии
Бизнес
Пользователи
Все
Новые
Популярные
1
Ilya Smirnov
Зарегистрирован 5 дней назад
2
Денис Васьков
Зарегистрирован 1 неделю назад
3
Dima Patrushev
Зарегистрирован 1 неделю назад
4
sirojidddin otaboyev
Зарегистрирован 2 недели назад
5
Елена Гайдамамакинат
Зарегистрирован 2 недели назад
JA
KO
RU
© kzen.dev 2023
Источник
stackoverflow.com
под лицензией cc by-sa 3.0 с атрибуцией