我在appspot上有一个应用程序,可以通过常规浏览器正常工作,但是当通过Android WebView使用时,它无法设置和读取cookie.我不是想在这个Web应用程序BTW"外面"获取cookie,一旦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]); } .. }
有任何想法吗?
如果您使用的是Android Lollipop,即SDK 21,那么:
CookieManager.getInstance().setAcceptCookie(true);
不行.你需要使用:
CookieManager.getInstance().setAcceptThirdPartyCookies(webView, true);
我遇到了同样的问题,上面的一行充当了魅力.
从Android文档:
将
CookieSyncManager
用于同步RAM和永久存储之间的浏览器cookie存储.为了获得最佳性能,浏览器cookie保存在RAM中.一个单独的线程在由计时器驱动之间保存cookie.要使用
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不在同一会话"内"工作. -
布拉克:我遇到了同样的问题.启用Cookie修复了该问题.
CookieManager.getInstance().setAcceptCookie(true);