Java Android上的WebView和Cookie

Java Android上的WebView和Cookie,java,android,Java,Android,我在appspot上有一个应用程序,可以通过普通浏览器正常工作,但是当通过Android WebView使用时,它无法设置和读取cookie。顺便说一句,我不想在这个web应用程序的“外部”获取cookies,一旦WebView访问了URL,所有处理、ID等都可以留在那里,我所需要的只是该应用程序内部的会话管理。第一个屏幕也可以正常加载,所以我知道WebView+服务器的交互性并没有被破坏 我看了WebSettings类,并没有像setEnableCookies这样的调用 我像这样加载url:

我在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);这对谁有用吗???我仍然有这个问题,如果有人能帮助我,我将不胜感激