Java-Android上的WebView和Cookies

我在appspot上有一个可以通过常规浏览器正常运行的应用程序,但是当通过Android WebView使用时,它无法设置和读取cookie。 我并不是要在此Web应用程序外部获取cookie,顺便说一句,一旦WebView访问了URL,所有处理,ID等都可以保留在那里,我所需要的只是该应用程序内部的会话管理。 第一个屏幕也加载正常,因此我知道WebView +服务器的交互性没有中断。

我看着WebSettings类,没有像setEnableCookies这样的调用。

我这样加载网址:

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]);
  }
  .. 
}

有任何想法吗?

burak bayramli asked 2020-01-14T10:10:10Z
5个解决方案
85 votes

如果您使用的是Android Lollipop即SDK 21,则:

CookieManager.getInstance().setAcceptCookie(true);

将无法正常工作。 您需要使用:

CookieManager.getInstance().setAcceptThirdPartyCookies(webView, true);

我遇到了同样的问题,上面的那行很吸引人。

Huzefa Gadi answered 2020-01-14T10:10:37Z
41 votes

从Android文档中:

CookieSyncManager.getInstance().stopSync() 用于同步浏览器cookie   在RAM和永久存储之间存储。 为了获得最佳性能,   浏览器cookie被保存在RAM中。 一个单独的线程保存cookie   之间,由计时器驱动。

要使用 CookieSyncManager.getInstance().stopSync() ,主机应用程序必须调用   当应用程序启动时,以下内容:

 CookieSyncManager.getInstance().stopSync()

要设置同步,主机应用程序必须调用

 CookieSyncManager.getInstance().stopSync()

在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]);
Pentium10 answered 2020-01-14T10:11:50Z
35 votes

我知道发生了什么事。

当我通过服务器端操作(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]);

这样可以解决问题。

burak bayramli answered 2020-01-14T10:12:24Z
7 votes

我的问题是cookie无法在同一会话内“工作”。 –

布拉克:我有同样的问题。 启用cookie可以解决此问题。

CookieManager.getInstance().setAcceptCookie(true);
Phil answered 2020-01-14T10:12:49Z
1 votes

CookieManager.getInstance().setAcceptCookie(true);通常,如果您的Web视图已经初始化,它应该可以工作

或尝试以下方法:

CookieSyncManager.createInstance(this);
CookieManager cookieManager = CookieManager.getInstance();
cookieManager.removeAllCookie();
cookieManager.setAcceptCookie(true);
Miro answered 2020-01-14T10:13:13Z
translate from https://stackoverflow.com:/questions/2566485/webview-and-cookies-on-android