Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Problema de Cookie de Android WebView

Tengo un servidor que envía mi aplicación androide una cookie de sesión para ser utilizado para la comunicación autenticada. Estoy intentando cargar un WebView con una URL que señala a ese mismo servidor y estoy intentando pasar en la galleta de la sesión para la autentificación. Estoy observando que funciona intermitentemente, pero no tengo ni idea de por qué. Utilizo la misma cookie de sesión para realizar otras llamadas en mi servidor y estas nunca fallan la autenticación. Observo solamente este problema al intentar cargar una URL en un WebView, y no sucede cada vez. Muy frustrante.

A continuación se muestra el código que estoy usando para hacer esto. Cualquier ayuda será apreciada.

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); 

  • Emular archivos de hosts en Android no enraizado
  • Envoltura de HTML en una aplicación para Android
  • Cómo deshabilitar el desplazamiento horizontal en la vista web de Android
  • ¿Cómo puedo abrir una aplicación de mi navegador web (Chrome) en Android? ¿Qué tengo que ver con el enlace A Href?
  • Detectar si la página web se carga en la aplicación nativa de Facebook en iOS / Android
  • Cómo habilitar la depuración remota / inspector de la aplicación Android de WebKit mediante WebView?
  • Google ya no permite el uso de WebView. ¿Cuáles son las alternativas?
  • El host de destino no debe ser nulo o configurado en parameters.scheme = null, host = null
  • 12 Solutions collect form web for “Problema de Cookie de Android WebView”

    Gracias justingrammens ! Eso funcionó para mí, me las arreglé para compartir la cookie dentro de mis solicitudes DefaultHttpClient y actividad de WebView:

     //------- Native request activity private DefaultHttpClient httpClient; public static Cookie cookie = null; //After Login List<Cookie> 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"); 

    La solución es darle al Android suficiente tiempo para procesar las cookies. Usted puede encontrar más información aquí: http://code.walletapp.net/post/46414301269/passing-cookie-to-webview

    He pasado la mayor mitad de 3 horas trabajando en un tema muy similar. En mi caso tuve una serie de llamadas, que hice a un servicio web usando un DefaulHttpClient y luego quería establecer la sesión y todas las demás cookies correspondientes en mi WebView .

    No sé si esto resolverá su problema, ya que no sé lo que hace su método getCookie() , pero en mi caso en realidad tuve que llamar.

     cookieManager.removeSessionCookie(); 

    Primero para quitar la cookie de sesión y luego volver a agregarla. Encontré que cuando intenté fijar la galleta de JSESSIONID sin primero quitarla, el valor que deseé fijar a no era ahorrar. No estoy seguro de si esto le ayudará problema en particular, pero pensé que compartiría lo que había encontrado.

    Me gustaría guardar esa cookie de sesión como una preferencia y repopular con fuerza el gestor de cookies con él. Suena que la cookie de sesión en no sobrevivir Actividad de reinicio

    Gracias Android por arruinar mi domingo. . . Heres lo que fija mi Apps (después de init su webview)

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

    Debo decir que las respuestas anteriores, probablemente funcionará, pero en mi situación el momento de Android fue v5 + mi androide webview javascript 'apps' murió.

    Tengo un enfoque diferente de otras personas aquí, y es un enfoque que garantiza el trabajo sin tener que lidiar con el CookieSyncManager (donde usted está a merced de la semántica como "Tenga en cuenta que incluso sync () sucede asincrónicamente").

    Esencialmente, buscamos el dominio correcto, entonces ejecutamos javascript desde el contexto de la página para establecer las cookies para ese dominio (de la misma manera que la propia página). Dos inconvenientes del método son que pueden introducir un tiempo extra de ida y vuelta debido a la solicitud http adicional que tiene que hacer; Y si su sitio no tiene el equivalente de una página en blanco, puede mostrar cualquier URL que cargue primero antes de llevarlo al lugar correcto.

     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<Cookie> 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<Cookie> 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; } } } } 

    Si confías en el dominio de donde provienen las cookies, puedes salir sin apache commons, pero tienes que entender que esto puede presentar un riesgo XSS si no tienes cuidado.

    Este es un bit de trabajo de código.

      private void setCookie(DefaultHttpClient httpClient, String url) { List<Cookie> 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(); } } 

    Aquí el httpclient es el objeto DefaultHttpClient que utilizó en la solicitud HttpGet / HttpPost. También una cosa para asegurarse de que es el nombre de la cookie y el valor, que debe darse

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

    SetCookie establecerá la cookie para la URL dada.

    Me resolvió mágicamente todos mis problemas de cookies con esta línea en onCreate:

    CookieHandler.setDefault(new CookieManager());

    Editar: dejó de funcionar hoy. 🙁 lo que la basura, androide.

    Encontramos esto también. Esto es lo que hice.

    En mi LoginActivity, dentro de mi AsyncTask, tengo lo siguiente:

     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 es otra clase que contiene la variable sessionCookie definida como List cookies; Y cookieStore definen como BasicCookieStore cookieStore;

    Entonces en mi Fragmento, donde mi WebView se encuentra tengo lo siguiente:

     //DECLARE LIST OF COOKIE List<Cookie> sessionCookie; 

    Dentro de mi método o justo antes de configurar el 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 } 

    Sugerencia rápida: Haga que firebug esté instalado en firefox o utilice la consola de desarrollador en cromo y pruebe primero su página web, capture la cookie y compruebe el dominio para poder almacenarlo en alguna parte y asegúrese de que está configurando correctamente el dominio correcto.

    Edit: editado CookieStoreHelper.cookies a CookieStoreHelper.sessionCookie

    Mi código de trabajo

     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; } 

    Para depurar la consulta, "cookieManager.setCookie (….);" Te recomiendo que mires a través del contenido de la base de datos webviewCookiesChromium.db (almacenado en "/data/data/my.app.webview/database") Allí Puedes ver la configuración correcta.

    Deshabilitar "cookieManager.removeSessionCookie ();" Y / o "cookieManager.removeAllCookie ();"

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

    Compare el valor establecido con los que se establecen con el navegador. Ajustar la solicitud para la instalación de las cookies antes de que el navegador "flags" no se instale encajará con lo que Usted decida. He encontrado que una consulta puede ser "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" 

    No utilice su url sin procesar

     cookieManager.setCookie(myUrl, cookieString); you need like this:cookieManager.setCookie("your url host", cookieString); 
    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.