Eu tenho um servidor que envia ao meu aplicativo Android um cookie de sessão para ser usado para comunicação autenticada. Estou tentando carregar um WebView com uma URL apontando para esse mesmo servidor e estou tentando passar o cookie de sessão para autenticação. Estou observando que funciona intermitentemente, mas não tenho ideia do porquê. Eu uso o mesmo cookie de sessão para fazer outras chamadas no meu servidor e estas nunca falham na autenticação. Eu só observo esse problema quando tento carregar uma URL em um WebView, e isso não acontece todas as vezes. Muito frustrante.
Abaixo está o código que estou usando para fazer isso. Qualquer ajuda será muito 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);
Respostas:
Obrigado justingrammens ! Isso funcionou para mim, consegui compartilhar o cookie dentro de minhas solicitações DefaultHttpClient e atividade do WebView:
fonte
Obrigado Android por arruinar meu domingo. . . Aqui está o que consertou meus aplicativos (depois de iniciar seu webview)
Devo dizer que as respostas acima provavelmente funcionarão, mas na minha situação, no momento em que o Android se tornou v5 +, meu android webview javascript 'apps' morreu.
fonte
Solução: Webview CookieSyncManager
fonte
cookie
?, eu só fico assim:PHPSESSID=ljfakdjfklasdfaj
!, isso é o suficiente?a solução é dar ao Android tempo suficiente para processar os cookies. Você pode encontrar mais informações aqui: http://code.walletapp.net/post/46414301269/passing-cookie-to-webview
fonte
Gostaria de salvar esse cookie de sessão como uma preferência e preencher novamente o gerenciador de cookies com ele. Parece que o cookie de sessão não sobreviveu ao reinício da atividade
fonte
Passei a maior parte das três horas trabalhando em um problema muito semelhante. No meu caso, recebi várias chamadas, que fiz para um serviço da web usando um
DefaulHttpClient
e, em seguida, quis definir a sessão e todos os outros cookies correspondentes no meuWebView
.Não sei se isso vai resolver o seu problema, pois não sei o que seu
getCookie()
método faz, mas no meu caso na verdade tive que ligar.Primeiro, remova o cookie de sessão e depois adicione-o novamente. Eu estava descobrindo que quando tentei definir o
JSESSIONID
cookie sem primeiro removê-lo, o valor que eu queria defini-lo não estava sendo salvo. Não tenho certeza se isso irá ajudá-lo em um problema específico, mas pensei em compartilhar o que descobri.fonte
CookieManager.getInstance().removeAllCookie ();
?Depois de algum tempo pesquisando reuni algumas peças que me fizeram chegar a essa solução. Uma vez que CookieSyncManager se torne obsoleto, esta pode ser a melhor maneira de definir um cookie específico para uma visualização da web em Kotlin hoje em dia, você não precisa de mais nada.
fonte
Eu tenho uma abordagem diferente de outras pessoas aqui, e é uma abordagem que funciona garantidamente sem lidar com o CookieSyncManager (onde você está à mercê da semântica como "Observe que mesmo o sync () acontece de forma assíncrona").
Basicamente, navegamos até o domínio correto e, em seguida, executamos o javascript do contexto da página para definir cookies para esse domínio (da mesma forma que a própria página faria). Duas desvantagens do método são que pode introduzir um tempo extra de ida e volta devido à solicitação extra de http que você precisa fazer; e se o seu site não tiver o equivalente a uma página em branco, ele pode exibir qualquer URL que você carregar primeiro antes de levá-lo ao lugar certo.
Se você confia no domínio de origem dos cookies, você pode escapar sem o apache commons, mas deve entender que isso pode representar um risco de XSS se você não for cuidadoso.
fonte
Este é um código funcional.
Aqui, httpclient é o objeto DefaultHttpClient que você usou na solicitação HttpGet / HttpPost. Além disso, uma coisa a ter certeza é o nome e o valor do cookie, ele deve ser fornecido
setCookie irá definir o cookie para o URL fornecido.
fonte
Eu resolvi magicamente todos os meus problemas de cookies com esta linha em onCreate:
CookieHandler.setDefault(new CookieManager());
editar: parou de funcionar hoje. :( que merda, android.
fonte
Também encontrei isso. Aqui está o que eu fiz.
Na minha LoginActivity, dentro da minha AsyncTask, tenho o seguinte:
// WHERE CookieStoreHelper.sessionCookie é outra classe que contém a variável sessionCookie definida como List cookies; e cookieStore é definido como BasicCookieStore cookieStore;
Então, em meu Fragment, onde meu WebView está localizado, tenho o seguinte:
dentro do meu método ou um pouco antes de configurar o WebViewClient ()
Dica rápida: tenha o firebug instalado no firefox ou use o console do desenvolvedor no Chrome e teste primeiro sua página da web, capture o cookie e verifique o domínio para que possa armazená-lo em algum lugar e certifique-se de que está configurando corretamente o domínio correto.
Editar: CookieStoreHelper.cookies editado para CookieStoreHelper.sessionCookie
fonte
Meu código de trabalho
Para depurar a consulta, "cookieManager.setCookie (....);" Recomendo que você examine o conteúdo do banco de dados webviewCookiesChromium.db (armazenado em "/data/data/my.app.webview/database"). Lá você pode ver as configurações corretas.
Desativando "cookieManager.removeSessionCookie ();" e / ou "cookieManager.removeAllCookie ();"
Compare o valor definido com aqueles definidos pelo navegador. Ajuste o pedido de instalação dos cookies antes até que o navegador "flags" não esteja instalado irá caber com o que você decidir. Descobri que uma consulta pode ser "sinalizadores":
fonte
Alguns comentários (pelo menos para APIs> = 21) que descobri por experiência própria e me deram dores de cabeça:
http
e oshttps
urls são diferentes. Definir um cookie parahttp://www.example.com
é diferente de definir um cookie parahttps://www.example.com
https://www.example.com/
funciona, mashttps://www.example.com
não funciona.CookieManager.getInstance().setCookie
está executando uma operação assíncrona. Portanto, se você carregar um url logo após configurá-lo, não é garantido que os cookies já tenham sido gravados. Para evitar comportamentos inesperados e instáveis, use o CookieManager # setCookie (String url, String value, ValueCallback callback) ( link ) e comece a carregar o url depois que o callback for chamado.Espero que meus dois centavos economizem algum tempo de algumas pessoas para que você não tenha que enfrentar os mesmos problemas que eu.
fonte
Eu enfrentei o mesmo problema e isso vai resolver esse problema em todas as versões do Android
fonte
Observe que pode ser melhor usar subdomínios em vez do URL normal. Portanto, defina em
.example.com
vez dehttps://example.com/
.Graças a Jody Jacobus Geers e outros, escrevi assim:
fonte
Não use seu url bruto
Ao invés de:
use-o assim:
fonte