Как установить cookie в клиенте Android WebView
Я хочу вызвать один конкретный URL-адрес через WebView . Страница может быть вызвана только после того, как пользователь уже вошел в систему. Я использую библиотеку AsyncHttpClient для выполнения вызова входа. После успешного входа в систему загрузка URL-адреса через WebView , похоже, не распознает правильные заголовки, например cookie. Я подозреваю, что файлы cookie неправильно синхронизируются между HttpClient и WebView’s HttpClient . Есть идеи, почему? . Вот как я использую WebView
Ценю твою помощь .
3 ответа
Ох, через несколько часов, я наконец понял, что это сработало. Во-первых, CookieSyncManager устарел в более поздних версиях Android. поскольку api 21 согласно док. Поэтому решил больше не использовать. Во-вторых, CookieManager используется для хранения файлов cookie для WebView .
Финальный код
Ключевые изменения в решении: использовать cookie.getDomain () вместо явного домена.
Попробуйте этот код, после нескольких изменений у меня работает:
Моя проблема была немного другой, но ответ от @Tixeon дал мне ключ к ее решению. Я составлял свой файл cookie и добавлял его в запрос WebView, но обнаружил, что Android переопределяет мой файл cookie и отправляет свой собственный файл cookie. Итак, прежде всего мне пришлось удалить все файлы cookie из массива, а затем создать свой собственный файл cookie. Это пример кода:
Теперь запрос содержит мой файл cookie, а не тот, который по умолчанию предоставляется Android, и мой сеанс в WebView работает. Надеюсь, это поможет кому-то другому
Источник
Как загрузить страницу в WebView с куками?
Есть ссылка на определенную страницу (https://. ), которую надо отобразить в WebView. Сайт с авторизацией, авторизационные куки есть (их отдает веб сервис). Но вместо загрузки нужной страницы постоянно получаю отлуп на страницу ввода логина.
Пробовал по всякому, ничего не помогло.
где cookies — авторизационные куки.
На счет второго варианта иллюзий не питал, в документации ясно сказано: Note that if this map contains any of the headers that are set by default by this WebView, such as those controlling caching, accept types or the User-Agent, their values may be overriden by this WebView’s defaults.
Может кто-то из знающих подскажет, в чем проблема или же подскажет, как правильно реализовать загрузку страницы с авторизационными куками?
- Вопрос задан более трёх лет назад
- 6821 просмотр
Проблема решается перекрытием в WebViewClient метода shouldInterceptRequest(). WebView подставляет куки не во все запросы (в частности при обращении к ресурсам типа картинок, js, css, . не подставляет), из-за чего имеем описанную выше проблему.
У конструктора WebResourceResponse первые два параметра mimeType и encoding, которые мы можем получить из заголовка response. Но в моем случае, чёрт знает по какой причине, если передавать их в конструктор — получаю 400 Bad Request.
Может не совсем в тему. Бадался с cookie в своем приложении, использовал Retrofit 2 и OkHttp3 (сервер тоже свой — nginx), сколько ни пробовал примеров с getDefaultSharedPreferences() не получалось сохранить ничего кроме PHPSESSID. Решил вручную записывать через SharedPreferences editor.putString(name, value ); научился сохранять и посылать cookie, но сервер не всегда адекватно на них реагировал: заметил, что если PHPSESSID стоит в конце списка посылаемых cookie, то все нормально, иначе сервер высылает код новой сессии. Когда сложил все cookie в одну строку все заработало.
public class AddCookiesInterceptor implements Interceptor <
public static final String PREF_COOKIES = «PREF_COOKIES»;
// We’re storing our stuff in a database made just for cookies called PREF_COOKIES.
// I reccomend you do this, and don’t change this default value.
private Context context;
public AddCookiesInterceptor(Context context) <
this.context = context;
>
@Override
public Response intercept(Interceptor.Chain chain) throws IOException <
Request.Builder builder = chain.request().newBuilder();
Log.i(«MyCookie»,»————————————«);
G_.cookie = PrefStorage.getAllProperty();
String val=»»;
for(Map.Entryentry : G_.cookie.entrySet()) <
val += (String)entry.getValue()+»; «;
>
builder.addHeader(«Cookie», val);
Log.i(«MyCookie»,val);
Log.i(«MyCookie»,»————————————«);
public class ReceivedCookiesInterceptor implements Interceptor <
private Context context;
public ReceivedCookiesInterceptor(Context context) <
this.context = context;
> // AddCookiesInterceptor()
@Override
public Response intercept(Chain chain) throws IOException <
Response originalResponse = chain.proceed(chain.request());
if (!originalResponse.headers(«Set-Cookie»).isEmpty()) <
String tmp;
for(String header : originalResponse.headers(«Set-Cookie»)) <
tmp = header.split(«=»)[0];
PrefStorage.addProperty(tmp, header);
>
>
public class PrefStorage < // обязательно инициализировать
public static final String STORAGE_NAME = «StorageName»;
private static SharedPreferences settings = null;
private static SharedPreferences.Editor editor = null;
private static Context context = null;
public static void init( Context cntxt ) <
context = cntxt;
>
Источник
atoennis / fragment.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
webView . setWebViewClient( new WebViewClient () < |
@Override |
public boolean shouldOverrideUrlLoading ( WebView view , String url ) < |
String cookieStr = CookieManager . getInstance() . getCookie(url); // android.webkit.CookieManager |
storeCookies(url, cookieStr); |
return super . shouldOverrideUrlLoading(view, url); |
> |
// Convert cookie string into a list of cookies. Persist cookies in a java.net.CookieStore |
private void storeCookies ( String url , String cookieStr ) < |
if (cookieStr != null && ! cookieStr . isEmpty()) < |
URI uri = new URI (url); |
List HttpCookie > cookies = HttpCookie . parse(cookieStr); |
for ( HttpCookie cookie : cookies) < |
cookieStore . add(uri, cookie); // java.net.CookieStore from a java.net.CookieManager |
> |
> |
> |
> |
You can’t perform that action at this time.
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.
Источник
Как сохранить файл cookie в Android webview навсегда?
С моим кодом ниже, я смог сохранить файл cookie, но как только я закрываю приложение, файл cookie исчезает.
Как это вызвано и как я могу решить это?
3 ответов
вы должны сказать CookieSyncManager для синхронизации после загрузки страницы в вопрос. В вашем примере кода onCreate метод выполняется полностью перед WebView пытается загрузить страницу, поэтому процесс синхронизации (который происходит асинхронно), вероятно, завершится до загрузки страницы.
вместо этого скажите CookieSyncManager синхронизировать onPageFinished в WebViewClient. Это даст тебе то, что ты хочешь.
В Документация CookieSyncManager хорошо читать, как это сделать правильно.
вот как вы можете настроить реализацию WebViewClient, чтобы сделать это за вас:
вам не нужно будет говорить CookieSyncManager синхронизировать в другом месте с этим на месте. Я не проверял это, так что дайте мне знать, если это работает.
.sync () должен принудительно синхронизировать imediate и должен вызываться после загрузки страницы ,потому что он синхронизирует ОЗУ с кэшем , поэтому cookie должен быть в ОЗУ перед вызовом .
система автоматически синхронизирует его каждые 5 минут, если вы используете эту схему
Я думаю, что вы не ждали 5 минут, поэтому сохраните файл cookie.
для тех, кто сталкивается с проблемами с CookieManager класс, чтобы cookie сохранялся даже после закрытия приложения, они должны попробовать flush() функции CookieManager .
обратите внимание, что я не пробовал это, поэтому, если это работает, пожалуйста, дайте мне знать тоже.
согласно документации android
гарантирует, что все файлы cookie, доступные в настоящее время через API getCookie, записываются в persistent место хранения. Этот вызов будет блокировать вызывающего абонента, пока это не будет сделано и может выполнять ввод-вывод
и в CookieSyncManager documnentation написано, что:
этот класс устарел на уровне API 21. Теперь WebView автоматически синхронизирует файлы cookie по мере необходимости. Вам больше не нужно создавать или использовать CookieSyncManager. Чтобы вручную принудительно синхронизировать, вы можете использовать метод CookieManager flush (), который является синхронной заменой sync(). CookieSyncManger ссылка
Источник
WebView и Cookies на Android
У меня есть приложение на appspot, которое отлично работает через обычный браузер, однако при использовании через Android WebView он не может устанавливать и читать файлы cookie. Я не пытаюсь получить файлы cookie «за пределами» этого веб-приложения BTW, как только URL-адрес посетит WebView, вся обработка, идентификаторы и т. Д. Могут остаться там, все, что мне нужно, – это управление сеансом внутри этого приложения. Первый экран также загружается отлично, поэтому я знаю, что интерактивность WebView + не нарушена.
Я просмотрел класс WebSettings, не было вызова типа setEnableCookies.
Я загружаю URL-адрес следующим образом:
Если вы используете Android Lollipop, то есть SDK 21, тогда:
Не будет работать. Вам необходимо использовать:
Я столкнулся с тем же вопросом, и вышеприведенная линия работала как прелесть.
Из документации для Android :
CookieSyncManager используется для синхронизации хранилища CookieSyncManager cookie браузера между ОЗУ и постоянным хранилищем. Чтобы получить максимальную производительность, куки-файлы браузера сохраняются в ОЗУ. Отдельный поток сохраняет файлы cookie между ними, управляемыми таймером.
Чтобы использовать CookieSyncManager , приложение-хост должно вызвать следующее при запуске приложения:
Чтобы настроить синхронизацию, необходимо, чтобы хост-приложение вызывало
В Activity.onResume () и вызове
Чтобы получить мгновенную синхронизацию вместо ожидания запуска таймера, хост может звонить
Интервал синхронизации составляет 5 минут, поэтому вам потребуется принудительно синхронизировать вручную, например, в onPageFinished (WebView, String). Обратите внимание, что даже sync () происходит асинхронно, поэтому не делайте этого так же, как ваша активность отключается.
Наконец, что-то вроде этого должно работать:
Я понял, что происходит.
Когда я загружаю страницу с помощью действия на стороне сервера (URL-адрес) и просматриваю html, возвращенный из этого действия внутри Webview, это первое действие / страница выполняется внутри этого Webview. Однако, когда вы нажимаете на любую ссылку, которая является командами действий в вашем веб-приложении, эти действия запускают новый браузер . Вот почему информация о файлах cookie теряется, потому что первая информация о cookie, которую вы установили для Webview, ушла, у нас есть отдельная программа.
Вы должны перехватывать клики на Webview, чтобы браузер никогда не покидал приложение, все остается в одном и том же Webview.
Это устраняет проблему.
Моя проблема заключается в том, что файлы cookie не работают «внутри» того же сеанса. –
Бурак: У меня была такая же проблема. Исправлена проблема с установкой файлов cookie.
Источник