Java Android上的WebView和Cookie
我在appspot上有一个应用程序,可以通过普通浏览器正常工作,但是当通过Android WebView使用时,它无法设置和读取cookie。顺便说一句,我不想在这个web应用程序的“外部”获取cookies,一旦WebView访问了URL,所有处理、ID等都可以留在那里,我所需要的只是该应用程序内部的会话管理。第一个屏幕也可以正常加载,所以我知道WebView+服务器的交互性并没有被破坏 我看了WebSettings类,并没有像setEnableCookies这样的调用 我像这样加载url:Java Android上的WebView和Cookie,java,android,Java,Android,我在appspot上有一个应用程序,可以通过普通浏览器正常工作,但是当通过Android WebView使用时,它无法设置和读取cookie。顺便说一句,我不想在这个web应用程序的“外部”获取cookies,一旦WebView访问了URL,所有处理、ID等都可以留在那里,我所需要的只是该应用程序内部的会话管理。第一个屏幕也可以正常加载,所以我知道WebView+服务器的交互性并没有被破坏 我看了WebSettings类,并没有像setEnableCookies这样的调用 我像这样加载url:
public class MyActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
WebView webview = new WebView(this);
setContentView(webview);
webview.loadUrl([MY URL]);
}
..
}
有什么想法吗 来自:
CookieSyncManager
用于同步浏览器cookie
在RAM和永久存储器之间存储。为了获得最佳性能,
浏览器cookie保存在RAM中。一个单独的线程保存cookies
之间,由计时器驱动
要使用CookieSyncManager,主机应用程序必须调用
当应用程序启动时,请执行以下操作:
CookieSyncManager.createInstance(context)
要设置同步,主机应用程序必须调用
CookieSyncManager.getInstance().startSync()
在Activity.onResume()中,调用
CookieSyncManager.getInstance().stopSync()
在Activity.onPause()中
要获得即时同步,而不是等待计时器触发
主人可以打电话
CookieSyncManager.getInstance().sync()
同步间隔为5分钟,因此您需要强制同步
无论如何都要手动,例如在onPageFinished(WebView,String)中。注
即使sync()也是异步发生的,所以不要像您的
活动正在关闭
最后,类似这样的方法应该会奏效:
// use cookies to remember a logged in status
CookieSyncManager.createInstance(this);
CookieSyncManager.getInstance().startSync();
WebView webview = new WebView(this);
webview.getSettings().setJavaScriptEnabled(true);
setContentView(webview);
webview.loadUrl([MY URL]);
我知道发生了什么事 当我通过服务器端操作(url访问)加载页面,并在Webview中查看该操作返回的html时,第一个操作/页面在该Webview中运行。但是,当您单击web应用程序中作为操作命令的任何链接时,这些操作将启动新浏览器。这就是为什么cookie信息丢失的原因,因为您为Webview设置的第一个cookie信息消失了,我们这里有一个单独的程序 你必须拦截Webview上的点击,这样浏览就不会离开应用程序,所有内容都会停留在同一个Webview中
WebView webview = new WebView(this);
webview.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url)
{
view.loadUrl(url); //this is controversial - see comments and other answers
return true;
}
});
setContentView(webview);
webview.loadUrl([MY URL]);
这就解决了问题
我的问题是Cookie在同一会话中不起作用
伯克:我也有同样的问题。启用cookies修复了这个问题
CookieManager.getInstance().setAcceptCookie(true);
CookieManager.getInstance().setAcceptCookie(true)代码>如果您的webview已经初始化,它通常会工作
或者试试这个:
CookieSyncManager.createInstance(this);
CookieManager cookieManager = CookieManager.getInstance();
cookieManager.removeAllCookie();
cookieManager.setAcceptCookie(true);
如果您使用的是Android棒棒糖,即SDK 21,则:
CookieManager.getInstance().setAcceptCookie(true);
不行。您需要使用:
CookieManager.getInstance().setAcceptThirdPartyCookies(webView, true);
我也遇到过同样的问题,上面这一行很有吸引力。你100%确定这与默认关闭JavaScript无关吗?我刚检查过,不是。谢谢您的输入。@burakbayramli您找到这个问题的答案了吗?尝试了这个,但我不想从webview中删除cookies。Cookie可以在两个单独的Webview加载URL调用之间消失,这很好。我的问题是Cookie在同一会话中不工作。另外,如果您使用WebView引用存储在本地文件系统上的资产,则需要在Build.VERSION.SDK_INT>=12时调用CookieManager.setAcceptFileSchemeCookies(true)。此调用必须在首次实例化CookieSyncManager或CookieManager之前进行。@RobinDavies您救了我一天!文档中写道:“该类在API级别21中被弃用。WebView现在会根据需要自动同步Cookie。您不再需要创建或使用CookieSyncManager。要手动强制同步,可以使用CookieManager方法CookieManager#flush,它是sync()的同步替换。”嗨,路西法,我尝试过这个,但我无法在cookies中存储邮件id和密码详细信息。webview是否存储详细信息?请帮帮我。当我第一次输入id和pwd时,应该保存这些详细信息,当我要使用相同的用户id和pwd登录时,这些信息应该存储在cookies中并显示出来,然后我必须选择该id。在webview中是否可以将详细信息存储在cookes中?感谢并提前问候。我也遵循了此链接此建议修复了我在Android 2.2.1上重新启动应用程序之间丢失Cookie的问题。要获得完整的解决方案,请在覆盖shouldOverrideUrlLoading
时检查答案。要使您的WebView
处理所有URL链接,它只需返回false
。不需要view.loadUrl(url)代码>。返回true实际上意味着您希望系统覆盖处理(可能是为了启动浏览器)。因此,如果希望在webview中打开链接,只需返回false。资料来源:错。错。错。Turbo是对的:您绝对不应该在这次回调中调用view.loadUrl()。无论是对是错,第三方都不应该对答案的代码进行根本性的更改。发表你自己的答案,或者如果你同意的话,投一个批评的评论。糟糕,返回false!我使用的是minSdk 16,targetsdk 23,即使我使用setAcceptCookie(true),这也不起作用。您正在测试的设备的操作系统版本是什么?CookieManager CookieManager=CookieManager.getInstance();if(Build.VERSION.SDK_INT>=Build.VERSION_code.LOLLIPOP){cookieManager.setAcceptThirdPartyCookies(webView,true);}否则{cookieManager.setAcceptCookie(true);}setAcceptThirdPartyCookies有2个参数。用法:CookieManager.getInstance().setAcceptThirdPartyCookies(myWebview,true);这对谁有用吗???我仍然有这个问题,如果有人能帮助我,我将不胜感激