Установите файл cookie для веб-просмотра в Android - PullRequest
18 голосов
/ 19 апреля 2011

Я получаю HttpResponse с сервера при проверке правильности имени пользователя или пароля.Когда я загружаю url в webview, я хочу, чтобы у webView был файл cookie (ответ, который я получаю, когда postData() хранится в webView. Я хочу, чтобы webView забрал файл cookie и загрузил URLс этим файлом cookie, хранящимся в веб-представлении.

Я получаю ответ через.

public HttpResponse postData() {
    HttpClient httpclient = new DefaultHttpClient();
    HttpPost httppost = new HttpPost("https://example.com/login.aspx");

    try {
        List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
        nameValuePairs.add(new BasicNameValuePair("txtUsername", "user"));
        nameValuePairs.add(new BasicNameValuePair("txtPassword", "123"));
        httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

        HttpResponse response = httpclient.execute(httppost);
        String responseAsText = EntityUtils.toString(response.getEntity());
        Log.v(TAG , "Response from req: " + responseAsText);
        return responseAsText;

    } catch (ClientProtocolException e) {

    } catch (IOException e) {

    }
    return null;
}

И я загружаю UULL с помощью:

webView.loadUrl("http://a_page.com/getpage.aspx?p=home");

Полагаю, яна самом деле я не управляю файлом cookie, и я понятия не имею, как это сделать. Есть предложения или решения?

Ответы [ 5 ]

10 голосов
/ 30 июня 2016

Это действительно очень просто.

String cookieString = "cookie_name=cookie_value; path=/";
CookieManager.getInstance().setCookie(baseUrl, cookieString);

, где cookieString отформатирован так же, как более традиционный Set-Cookie заголовок HTTP, а baseUrl - это сайт, к которому должен принадлежать cookie.*

10 голосов
/ 19 апреля 2011

Возможно, вы захотите взглянуть на это решение: Проблема с файлом cookie WebView Android

3 голосов
/ 24 октября 2018

Пара комментариев, которые я узнал из своего опыта и вызвал у меня головную боль:

  1. http и https URL разные. Установка cookie для http://www.example.com отличается от установки cookie для https://www.example.com
  2. Косая черта в конце URL также может иметь значение. В моем случае https://www.example.com/ работает, но https://www.example.com не работает.
  3. CookieManager.getInstance().setCookie выполняет асинхронную операцию. Таким образом, если вы загрузите URL-адрес сразу после его установки, это не гарантирует, что файлы cookie будут уже записаны. Чтобы предотвратить непредвиденное и нестабильное поведение, используйте CookieManager # setCookie (URL-адрес строки, значение String, обратный вызов ValueCallback) ( ссылка ) и начните загрузку URL-адреса после вызова обратного вызова.

Я надеюсь, что мои два цента сэкономят некоторое время у некоторых людей, поэтому вам не придется сталкиваться с такими же проблемами, как я.

0 голосов
/ 14 марта 2019

Вы должны использовать его с некоторым циклом, если у вас есть несколько элементов с куки (как в моем случае):

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")
0 голосов
/ 16 ноября 2017

Просто хочу бросить другой путь, как это можно сделать.Не сказать, что это лучшее, но это способ.Вы также можете использовать JavaScript для установки файлов cookie.Просто переопределите onPageFinished в WebViewClient

new WebViewClient() {

        override fun onPageFinished(view: WebView, url: String) {

                val javascript = """document.cookie = "key=$value""""

                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
                    view.evaluateJavascript(javascript) { s -> Timber.d("Inject: %s", s) }
                } else {
                    view.loadUrl("javascript:" + javascript, null)
                }
        }
}

Одна вещь с этим подходом: вам придется перезагрузить webView.Если кто-нибудь знает, как это исправить, прокомментируйте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...