【问题标题】:WebView and Cookies on AndroidAndroid 上的 WebView 和 Cookie
【发布时间】:2010-04-02 11:55:07
【问题描述】:

我在 apppot 上有一个应用程序,可以通过常规浏览器正常工作,但是当通过 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]);
  }
  .. 
}

有什么想法吗?

【问题讨论】:

  • 您是否 100% 确定这与 JavaScript 默认关闭无关?
  • 我刚查过,不是。感谢您的意见。
  • @burakbayramli 你找到这个问题的答案了吗?

标签: java android


【解决方案1】:

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

CookieManager.getInstance().setAcceptCookie(true);

行不通。你需要使用:

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

我遇到了同样的问题,上面的那句话很有魅力。

【讨论】:

  • 我正在使用 minSdk 16,targetsdk 23,这不起作用,即使我使用 setAcceptCookie(true)。
  • 您正在测试的设备的操作系统版本是多少?
  • CookieManager cookieManager = CookieManager.getInstance(); if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { cookieManager.setAcceptThirdPartyCookies(webView,true); } 其他 { cookieManager.setAcceptCookie(true); }
  • setAcceptThirdPartyCookies 有 2 个参数。使用:CookieManager.getInstance().setAcceptThirdPartyCookies(myWebview, true);
  • 这对任何人都有效吗???我仍然有这个问题,如果有人可以提供帮助,我将不胜感激
【解决方案2】:

来自Android documentation

CookieSyncManager用于同步浏览器cookie 存储在 RAM 和永久存储器之间。为了获得最佳性能, 浏览器 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]);

【讨论】:

  • 试过这个,但我并没有试图从 webview 中取出 cookie。 Cookie 可以在两个单独的 Webview loadUrl 调用之间消失,这很好。我的问题是 cookie 不能在同一会话“内”工作。
  • 也可以看看这个:stackoverflow.com/questions/1652850/…
  • 另外,如果您使用WebView引用存储在本地文件系统上的资产,则需要在Build.VERSION.SDK_INT >= 12时调用CookieManager.setAcceptFileSchemeCookies(true)。此调用必须先于 CookieSyncManager 或 CookieManager 的第一次实例化。
  • @RobinDavies 你拯救了我的一天!
  • 来自文档:“此类在 API 级别 21 中已弃用。WebView 现在会根据需要自动同步 cookie。您不再需要创建或使用 CookieSyncManager。要手动强制同步,您可以使用CookieManager 方法 CookieManager#flush,它是 sync() 的同步替换。"
【解决方案3】:

我知道发生了什么。

当我通过服务器端操作(url 访问)加载页面并在 Web 视图中查看从该操作返回的 html 时,第一个操作/页面在该 Web 视图中运行。但是,当您单击 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]);

这解决了问题。

【讨论】:

  • 实际上当覆盖shouldOverrideUrlLoading 以使您的WebView 处理所有URL 链接时,它应该只是return false。不需要view.loadUrl(url);。返回 true 实际上意味着您希望系统覆盖处理(可能是启动浏览器)。所以如果你想在你的 webview 中打开链接,只需要返回 false。来源:developer.android.com/guide/webapps/…
  • 错了。错误的。错误的。 Turbo 是对的:你绝对不应该在这个回调中调用 view.loadUrl()。
  • 对或错,第 3 方不应对答案代码进行根本性更改。如果您同意,请发布您自己的答案或提出批评意见。
  • 坏坏坏,返回false!
【解决方案4】:

我的问题是 cookie 不能在同一会话“内”工作。 ——

Burak:我也遇到了同样的问题。启用 cookie 解决了这个问题。

CookieManager.getInstance().setAcceptCookie(true);

【讨论】:

  • 嗨 Lucifer 我试过了,但我无法将邮件 ID 和密码详细信息存储在 cookie 中。 webview 是否存储详细信息?请帮助我。当我第一次输入 id 和 pwd 时,应该保存这些详细信息,当我要使用相同的 userid 和 pwd 登录时,这些详细信息应该存储在 cookie 中并且应该显示,然后我必须选择那个 id。在 webview 中是否可以在厨师中存储详细信息?提前致谢和问候。
  • 我也关注了这个链接stackoverflow.com/questions/5404274/…
  • 这个建议解决了我在 Android 2.2.1 上应用重启之间丢失 cookie 的问题
  • 完整解决方案,查看答案stackoverflow.com/a/47868677/3101777
【解决方案5】:

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

或者试试这个:

CookieSyncManager.createInstance(this);
CookieManager cookieManager = CookieManager.getInstance();
cookieManager.removeAllCookie();
cookieManager.setAcceptCookie(true);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-05
    • 2016-04-10
    • 2015-06-25
    • 2013-02-06
    • 2012-10-08
    • 2013-10-14
    相关资源
    最近更新 更多