Android上的WebView和Cookies

bur*_*mli 51 java android

我在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]);
  }
  .. 
}
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

小智 85

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

CookieManager.getInstance().setAcceptCookie(true);
Run Code Online (Sandbox Code Playgroud)

不行.你需要使用:

CookieManager.getInstance().setAcceptThirdPartyCookies(webView, true);
Run Code Online (Sandbox Code Playgroud)

我遇到了同样的问题,上面的一行充当了魅力.

  • CookieManager cookieManager = CookieManager.getInstance(); if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { cookieManager.setAcceptThirdPartyCookies(webView,true); } else { cookieManager.setAcceptCookie(true); } (15认同)
  • setAcceptThirdPartyCookies有2个参数.使用:CookieManager.getInstance().setAcceptThirdPartyCookies(myWebview,true); (7认同)
  • 这对任何人都有效吗???我仍然遇到问题,如果有人可以提供帮助,我将不胜感激 (2认同)

Pen*_*m10 41

Android文档:

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

要使用CookieSyncManager,主机应用程序必须在应用程序启动时调用以下内容:

CookieSyncManager.createInstance(context)
Run Code Online (Sandbox Code Playgroud)

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

CookieSyncManager.getInstance().startSync()
Run Code Online (Sandbox Code Playgroud)

在Activity.onResume()中,并调用

 CookieSyncManager.getInstance().stopSync()
Run Code Online (Sandbox Code Playgroud)

在Activity.onPause()中.

要获得即时同步而不是等待定时器触发,主机可以调用

CookieSyncManager.getInstance().sync()
Run Code Online (Sandbox Code Playgroud)

同步间隔为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]);
Run Code Online (Sandbox Code Playgroud)

  • 此外,如果使用WebView引用存储在本地文件系统上的资产,则需要在Build.VERSION.SDK_INT> = 12时调用CookieManager.setAcceptFileSchemeCookies(true).此调用必须优先于CookieSyncManager或CookieManager的首次实例化. (4认同)

bur*_*mli 35

我弄清楚发生了什么.

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

这解决了这个问题.

  • 实际上,当覆盖`shouldOverrideUrlLoading`以使你的`WebView`处理所有URL链接时,它应该只是'返回false`.不需要`view.loadUrl(url);`.返回true实际上意味着你想要**系统覆盖处理(可能是为了启动浏览器).因此,如果您希望在Webview中打开链接,只需返回false.资料来源:http://developer.android.com/guide/webapps/webview.html#HandlingNavigation (39认同)
  • 对或错,第三方不应该对答案的代码进行根本性的改变.如果您同意,请发表您自己的回答或提出批评意见. (5认同)
  • 错误.错误.错误.Turbo是对的:你绝对不应该在这个回调中调用view.loadUrl(). (3认同)

小智 7

我的问题是cookie不在同一会话"内"工作. -

布拉克:我遇到了同样的问题.启用Cookie修复了该问题.

CookieManager.getInstance().setAcceptCookie(true);
Run Code Online (Sandbox Code Playgroud)