使 Android WebView 不存储 cookie 或密码

Posted

技术标签:

【中文标题】使 Android WebView 不存储 cookie 或密码【英文标题】:Make Android WebView not store cookies or passwords 【发布时间】:2011-07-21 05:30:05 【问题描述】:

我使用android WebView for Twitter OAuth:Twitter 要求用户登录并授权应用程序,我检索访问令牌并将其保存在我的应用程序中。

我不需要(也不会)存储用户密码,但 WebView 会保留 Twitter 的 cookie,它还会询问用户是否希望它记住密码。因此,即使在通过他的 Twitter 帐户页面取消对应用程序的授权,并且我的应用程序销毁了访问令牌后,下次打开 WebView 时,它可能仍然处于登录状态,即使没有,它也有密码框已填满。

如何强制 WebView 不要求记住密码,也不保留会话 cookie? 如果这不可能,我可以删除它所有存储的状态(可能图像缓存除外)吗?

【问题讨论】:

你能把答案标记为正确吗? 【参考方案1】:

不保存密码:

WebView webview = new WebView(this);
WebSettings mWebSettings = webview.getSettings();
mWebSettings.setSavePassword(false);
mWebSettings.setSaveFormData(false);

对于 cookie:

CookieManager cookieManager = CookieManager.getInstance();
cookieManager.setAcceptCookie(false);

我不太确定 cookie 的实现。

【讨论】:

设置 setSaveFormData(false) 也会有所帮助。 @mudit,不需要单独创建WebSettings 的实例。你也可以这样做。 WebView webView = new WebView(this);webView.getSettings.setSavePassword(false); 小心 .setSavePassword 函数,因为它在 4.4 及更高版本中已被弃用:***.com/a/19361928/62921 在这些版本中,默认情况下它会为 false,并且不会提示弹出窗口。【参考方案2】:

您可以使用它来防止存储 cookie 并清除已存储的 cookie:

CookieSyncManager.createInstance(this);
CookieManager cookieManager = CookieManager.getInstance();
cookieManager.removeAllCookies(callback);
cookieManager.setAcceptCookie(false);

WebView webview = new WebView(this);
WebSettings ws = webview.getSettings();
ws.setSaveFormData(false);
ws.setSavePassword(false); // Not needed for API level 18 or greater (deprecated)

【讨论】:

当我想在使用 WebView 的 Twitter 中成功注销时为我工作。谢谢。 :) 这不是在运行 3 行时清除 cookie 吗?它不会阻止存储 cookie。这需要cookieManager.setAcceptCookie(false) 之类的东西。也就是说,这回答了我关于如何清除 cookie 的问题,谢谢。 谢谢。这拯救了我的一天! 需要拨打CookieSyncManager.createInstance(this);吗? @Erum 对我来说,诀窍是只删除所有 cookie,但不包括 cookieManager.setAcceptCookie(false);【参考方案3】:

我使用了以下解决方案:

CookieManager cookieManager = CookieManager.getInstance();
cookieManager.setAcceptCookie(false);

以下方法对我不起作用:

CookieManager cookieManager = CookieManager.getInstance();
cookieManager.removeAllCookie();

可能的原因可能是我们没有同步 cookie,如下所示:

CookieSyncManager.createInstance(getContext()).sync();

但这可能需要一些时间。

强制WebView 不要求记住密码也不行。

而且它也不利于可用性。

【讨论】:

【参考方案4】:

在一行中,试试这个。我认为这应该在启动 webview 后调用。

android.webkit.CookieManager.getInstance().removeAllCookie();

【讨论】:

【参考方案5】:

不要清除 cookie,因为它会影响其他会话,如 facebook 等。存储在 cookie 中,因此请尝试遵循此方法

在 oauth 事务之前,例如在 webview 创建之前

CookieManager cookieManager = CookieManager.getInstance();
cookieManager.setAcceptCookie(false);

在 oauth 交易之后,通过设置接受 cookie

cookieManager.setAcceptCookie(true);

我已经测试过它会起作用..

【讨论】:

【参考方案6】:

这是我在这种情况下看到的最好的答案

    webView.clearCache(true);
    webView.clearHistory();
    WebSettings webSettings = webView.getSettings();
    webSettings.setSaveFormData(false);
    webSettings.setSavePassword(false); // Not needed for API level 18 or greater (deprecated)

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1) 
        CookieManager.getInstance().removeAllCookies(null);
        CookieManager.getInstance().flush();
     else 
        CookieSyncManager cookieSyncMngr = CookieSyncManager.createInstance(this);
        cookieSyncMngr.startSync();
        CookieManager cookieManager = CookieManager.getInstance();
        cookieManager.removeAllCookie();
        cookieManager.removeSessionCookie();
        cookieSyncMngr.stopSync();
        cookieSyncMngr.sync();
    

【讨论】:

以上是关于使 Android WebView 不存储 cookie 或密码的主要内容,如果未能解决你的问题,请参考以下文章

Android - 应用更新后 WebView html5 本地存储不持久

Android:使锚链接在 ScrollView 内的 WebView 中工作

使 facebook 登录与 Android Webview 一起工作

Android Cordova:使 WebView HTML 元素透明以查看原生元素

使文件输入字段在Android nativescript vue webview上工作

将图像永久存储在离线 web 应用中 [Android WebView]