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: pub

我在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分钟,因此您需要强制同步 无论如何都要手动,例如在onPageFinishedWebView中,字符串。笔记 即使同步也是异步进行的,所以不要像您的 活动正在关闭

最后,类似这样的方法应该会奏效:

// 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.setAcceptCookietrue;通常,如果您的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.setAcceptFileSchemeCookiestrue。此调用必须在首次实例化CookieSyncManager或CookieManager之前进行。@RobinDavies您救了我一天!从文档中可以看出:该类在API级别21中被弃用。WebView现在会根据需要自动同步Cookie。您不再需要创建或使用CookieSyncManager。要手动强制同步,您可以使用CookieManager方法CookieManagerflush,它是同步的替代方法。嗨,Lucifer,我尝试过这个方法,但我无法在Cookie中存储邮件id和密码详细信息。webview是否存储详细信息?请帮帮我。当我第一次输入id和pwd时,应该保存这些详细信息,当我要使用相同的用户id和pwd登录时,这些信息应该存储在cookies中并显示出来,然后我必须选择该id。在webview中是否可以将详细信息存储在cookes中?感谢并提前问候。我也遵循了此链接此建议修复了我在Android 2.2.1上重新启动应用程序之间丢失Cookie的问题。对于完整的解决方案,请检查覆盖时的实际答案shouldOverrideUrlLoading使您的WebView处理所有URL链接,它只需返回false即可。不需要view.loadUrlurl;。返回true实际上意味着您希望系统覆盖处理,以便启动浏览器。因此,如果希望在webview中打开链接,只需返回false。资料来源:错。错误的错误的Turbo是对的:您绝对不应该在这次回拨中调用view.loadUrl。无论是对是错,第三方都不应该对答案的代码进行根本性的更改。发表你自己的答案,或者如果你同意的话,投一个批评的评论。糟糕,返回false!我使用的是minSdk 16和targetsdk 23,即使我与setAcceptCookietrue一起使用,这也不起作用
h您正在测试这个?CookieManager CookieManager=CookieManager.getInstance;ifBuild.VERSION.SDK_INT>=Build.VERSION_code.LOLLIPOP{cookieManager.setAcceptThirdPartyCookieswebView,true;}否则{cookieManager.setAcceptCookietrue;}setAcceptThirdPartyCookies有2个参数。使用:CookieManager.getInstance.setAcceptThirdPartyCookiesmyWebview,true;这对谁有用吗???我仍然有这个问题,如果有人能帮助我,我将不胜感激