Проблема с Android-файлом Android WebView

У меня есть сервер, который отправляет мое приложение для Android файл cookie сеанса, который будет использоваться для аутентификации. Я пытаюсь загрузить WebView с URL-адресом, указывающим на тот же сервер, и я пытаюсь передать в cookie сеанса для проверки подлинности. Я наблюдаю, что он работает с перерывами, но я понятия не имею, почему. Я использую тот же самый cookie сеанса, чтобы делать другие вызовы на моем сервере, и они никогда не завершают проверку подлинности. Я наблюдаю эту проблему только при попытке загрузить URL-адрес в WebView, и это происходит не каждый раз. Очень расстраивает.

Ниже приведен код, который я использую для этого. Любая помощь будет оценена.

String myUrl = ""http://mydomain.com/"; CookieSyncManager.createInstance(this); CookieManager cookieManager = CookieManager.getInstance(); Cookie sessionCookie = getCookie(); if(sessionCookie != null){ String cookieString = sessionCookie.getName() +"="+sessionCookie.getValue()+"; domain="+sessionCookie.getDomain(); cookieManager.setCookie(myUrl, cookieString); CookieSyncManager.getInstance().sync(); } WebView webView = (WebView) findViewById(R.id.webview); webView.getSettings().setBuiltInZoomControls(true); webView.getSettings().setJavaScriptEnabled(true); webView.setWebViewClient(new MyWebViewClient()); webView.loadUrl(myUrl); 

12 Solutions collect form web for “Проблема с Android-файлом Android WebView”

Спасибо, justingrammens ! Это сработало для меня, мне удалось передать cookie в мои запросы DefaultHttpClient и активность WebView:

 //------- Native request activity private DefaultHttpClient httpClient; public static Cookie cookie = null; //After Login List cookies = httpClient.getCookieStore().getCookies(); for (int i = 0; i < cookies.size(); i++) { cookie = cookies.get(i); } //------- Web Browser activity Cookie sessionCookie = myapp.cookie; CookieSyncManager.createInstance(this); CookieManager cookieManager = CookieManager.getInstance(); if (sessionCookie != null) { cookieManager.removeSessionCookie(); String cookieString = sessionCookie.getName() + "=" + sessionCookie.getValue() + "; domain=" + sessionCookie.getDomain(); cookieManager.setCookie(myapp.domain, cookieString); CookieSyncManager.getInstance().sync(); } 

Решение: Webview CookieSyncManager

 CookieSyncManager cookieSyncManager = CookieSyncManager.createInstance(mWebView.getContext()); CookieManager cookieManager = CookieManager.getInstance(); cookieManager.setAcceptCookie(true); cookieManager.removeSessionCookie(); cookieManager.setCookie("http://xx.example.com","mid="+MySession.GetSession().sessionId+" ; Domain=.example.com"); cookieSyncManager.sync(); String cookie = cookieManager.getCookie("http://xx.example.com"); Log.d(LOGTAG, "cookie ------>"+cookie); mWebView.getSettings().setJavaScriptEnabled(true); mWebView.setWebViewClient(new TuWebViewClient()); mWebView.loadUrl("http://xx.example.com"); 

решение должно дать Android достаточно времени для файлов cookie. Вы можете найти более подробную информацию здесь: http://code.walletapp.net/post/46414301269/passing-cookie-to-webview

Спасибо Android за то, что я разрушил свое воскресенье. , , Вот что фиксировало мои приложения (после того, как вы запустили свой веб-просмотр)

 if ( Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP ) { CookieManager cookieManager = CookieManager.getInstance(); cookieManager.setAcceptThirdPartyCookies( webView, true ); } 

Я должен сказать, что вышеупомянутые ответы, вероятно, будут работать, но в моей ситуации момент Android пошел v5 + мой андроид webview javascript ‘apps’ умер.

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

Я не знаю, поможет ли это решить вашу проблему, поскольку я не знаю, что делает ваш getCookie() , но в моем случае мне действительно нужно было позвонить.

 cookieManager.removeSessionCookie(); 

Сначала удалите файл cookie сеанса, а затем повторно добавьте его. Я обнаружил, что, когда я пытался установить cookie JSESSIONID без его первого удаления, значение, которое я хотел установить, не сохранялось. Не уверен, что это поможет вам в конкретной проблеме, но подумал, что я поделюсь тем, что нашел.

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

Мой рабочий код

 public View onCreateView(...){ mWebView = (WebView) view.findViewById(R.id.webview); WebSettings webSettings = mWebView.getSettings(); webSettings.setJavaScriptEnabled(true); ... ... ... CookieSyncManager.createInstance(mWebView.getContext()); CookieManager cookieManager = CookieManager.getInstance(); cookieManager.setAcceptCookie(true); //cookieManager.removeSessionCookie(); // remove cookieManager.removeAllCookie(); //remove // Recommended "hack" with a delay between the removal and the installation of "Cookies" SystemClock.sleep(1000); cookieManager.setCookie("https://my.app.site.com/", "cookiename=" + value + "; path=/registration" + "; secure"); // ; CookieSyncManager.getInstance().sync(); mWebView.loadUrl(sp.getString("url", "") + end_url); return view; } 

Чтобы отладить запрос, «cookieManager.setCookie (….);» Я рекомендую вам просмотреть содержимое базы данных webviewCookiesChromium.db (сохранено в «/data/data/my.app.webview/database») Там вы можете увидеть правильные настройки.

Отключение “cookieManager.removeSessionCookie ();” и / или “cookieManager.removeAllCookie ();”

 //cookieManager.removeSessionCookie(); // and/or //cookieManager.removeAllCookie();" 

Сравните установленное значение с теми, которые установлены браузером. Откорректируйте запрос на установку файлов cookie до того, как браузер «flags» не будет установлен в соответствии с тем, что вы решите. Я обнаружил, что запрос может быть «flags»:

 // You may want to add the secure flag for https: + "; secure" // In case you wish to convert session cookies to have an expiration: + "; expires=Thu, 01-Jan-2037 00:00:10 GMT" // These flags I found in the database: + "; path=/registration" + "; domain=my.app.site.com" 

У меня есть другой подход от других людей здесь, и это подход, который гарантированно работает без обращения к CookieSyncManager (где вы находитесь во власти семантики, например «Обратите внимание, что даже sync () происходит асинхронно»).

По сути, мы переходим к правильному домену, затем мы запускаем javascript из контекста страницы для установки файлов cookie для этого домена (так же, как и сама страница). Два недостатка метода заключаются в том, что они могут ввести дополнительное время в оба конца из-за дополнительной просьбы о том, что вам нужно сделать; и если ваш сайт не имеет эквивалента пустой страницы, он может мигать с любого загруженного вами URL-адреса, прежде чем вы попадете в нужное место.

 import org.apache.commons.lang.StringEscapeUtils; import org.apache.http.cookie.Cookie; import android.annotation.SuppressLint; import android.webkit.CookieManager; import android.webkit.CookieSyncManager; import android.webkit.WebView; import android.webkit.WebViewClient; public class WebViewFragment { private static final String BLANK_PAGE = "/blank.html" private CookieSyncManager mSyncManager; private CookieManager mCookieManager; private String mTargetUrl; private boolean mInitializedCookies; private List mAllCookies; public WebViewFragment(Context ctx) { // We are still required to create an instance of Cookie/SyncManager. mSyncManager = CookieSyncManager.createInstance(ctx); mCookieManager = CookieManager.getInstance(); } @SuppressLint("SetJavaScriptEnabled") public void loadWebView( String url, List cookies, String domain) { final WebView webView = ... webView.setWebViewClient(new CookeWebViewClient()); webView.getSettings().setJavaScriptEnabled(true); mInitializedCookies = false; mTargetUrl = url; mAllCookies = cookies; // This is where the hack starts. // Instead of loading the url, we load a blank page. webView.loadUrl("http://" + domain + BLANK_PAGE); } public static String buildCookieString(final Cookie cookie) { // You may want to add the secure flag for https: // + "; secure" // In case you wish to convert session cookies to have an expiration: // + "; expires=Thu, 01-Jan-2037 00:00:10 GMT" // Note that you cannot set the HttpOnly flag as we are using // javascript to set the cookies. return cookie.getName() + "=" + cookie.getValue() + "; path=" + cookie.getPath() + "; domain=" + cookie.getDomain() }; public synchronized String generateCookieJavascript() { StringBuilder javascriptCode = new StringBuilder(); javascriptCode.append("javascript:(function(){"); for (final Cookie cookie : mAllCookies) { String cookieString = buildCookieString(cookie); javascriptCode.append("document.cookie=\""); javascriptCode.append( StringEscapeUtils.escapeJavascriptString(cookieString)); javascriptCode.append("\";"); } // We use javascript to load the next url because we do not // receive an onPageFinished event when this code finishes. javascriptCode.append("document.location=\""); javascriptCode.append( StringEscapeUtils.escapeJavascriptString(mTargetUrl)); javascriptCode.append("\";})();"); return javascriptCode.toString(); } private class CookieWebViewClient extends WebViewClient { @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); if (!mInitializedCookies) { mInitializedCookies = true; // Run our javascript code now that the temp page is loaded. view.loadUrl(generateCookieJavascript()); return; } } } } 

Если вы доверяете домену, в котором находятся cookies, вы можете уйти без apache commons, но вы должны понимать, что это может представлять риск XSS, если вы не будете осторожны.

Это рабочий бит кода.

  private void setCookie(DefaultHttpClient httpClient, String url) { List cookies = httpClient.getCookieStore().getCookies(); if (cookies != null) { CookieSyncManager.createInstance(context); CookieManager cookieManager = CookieManager.getInstance(); cookieManager.setAcceptCookie(true); for (int i = 0; i < cookies.size(); i++) { Cookie cookie = cookies.get(i); String cookieString = cookie.getName() + "=" + cookie.getValue(); cookieManager.setCookie(url, cookieString); } CookieSyncManager.getInstance().sync(); } } 

Здесь httpclient - объект DefaultHttpClient, который вы использовали в запросе HttpGet / HttpPost. Также нужно убедиться, что имя файла cookie и его ценность должны быть указаны

 String cookieString = cookie.getName() + "=" + cookie.getValue(); 

setCookie установит файл cookie для данного URL-адреса.

Я волшебно решил все проблемы с файлами cookie с этой одной строкой в ​​onCreate:

CookieHandler.setDefault(new CookieManager());

edit: сегодня он не работает. 🙁 Что за дерьмо, андроид.

Об этом тоже говорили. Вот что я сделал.

В моей учетной записи LoginActivity внутри моей AsyncTask у меня есть следующее:

 CookieStoreHelper.cookieStore = new BasicCookieStore(); BasicHttpContext localContext = new BasicHttpContext(); localContext.setAttribute(ClientContext.COOKIE_STORE, CookieStoreHelper.cookieStore); HttpResponse postResponse = client.execute(httpPost,localContext); CookieStoreHelper.sessionCookie = CookieStoreHelper.cookieStore.getCookies(); 

// WHERE CookieStoreHelper.sessionCookie – это еще один class, содержащий переменную sessionCookie, определенную как cookies списка; и cookieStore определяют как BasicCookieStore cookieStore;

Затем на моем fragmentе, где находится мой WebView, я имею следующее:

 //DECLARE LIST OF COOKIE List sessionCookie; 

внутри моего метода или непосредственно перед установкой WebViewClient ()

 WebSettings settings = webView.getSettings(); settings.setJavaScriptEnabled(true); webView.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY); sessionCookie = CookieStoreHelper.cookieStore.getCookies(); CookieSyncManager.createInstance(webView.getContext()); CookieSyncManager.getInstance().startSync(); CookieManager cookieManager = CookieManager.getInstance(); CookieManager.getInstance().setAcceptCookie(true); if (sessionCookie != null) { for(Cookie c: sessionCookie){ cookieManager.setCookie(CookieStoreHelper.DOMAIN, c.getName() + "=" + c.getValue()); } CookieSyncManager.getInstance().sync(); } webView.setWebViewClient(new WebViewClient() { //AND SO ON, YOUR CODE } 

Быстрый совет: установите firebug на firefox или используйте консоль разработчика на Chrome и сначала проверьте свою веб-страницу, запишите Cookie и проверьте домен, чтобы вы могли его где-то сохранить и убедитесь, что правильно настроили правильный домен.

Изменить: отредактировал CookieStoreHelper.cookies для CookieStoreHelper.sessionCookie

Не используйте свой необработанный URL-адрес

Вместо:

 cookieManager.setCookie(myUrl, cookieString); 

используйте его вот так:

 cookieManager.setCookie("your url host", cookieString); 
Interesting Posts

Самый простой способ конвертировать int в строку в C ++

Является ли шифрование файловой системы хорошим, если кто-то ворует мой компьютер, пока он включен?

Отправить ссылку для оплаты через paypal

Можете ли вы обнаружить «drag and drop» в jQuery?

Создание макроса C с ## и __LINE__ (конкатенация маркера с помощью макроса позиционирования)

Как я могу переключаться между несколькими наборами сетевых конфигураций в Windows XP?

Полный рабочий пример сценария анимации с тремя fragmentами Gmail?

Двоичные файлы повреждены – Как загрузить двоичные файлы с помощью AngularJS

Как получить поддержку Java в Google Chrome в Linux?

Как правильно установить и настроить JSF-библиотеки через Maven?

Массовое удаление файлов в Windows

как конвертировать миллисекунды в формат даты в android?

Отключить Vista UAC только для администратора

«Не удалось загрузить тип . Глобальное», вызывающее у меня горе

Почему обращается к TextView fragmentа внутри операции, вызывая ошибку

Давайте будем гением компьютера.