如何在Android中实现webview的多重登录?

时间:2014-10-12 07:54:19

标签: android cookies web webview accounts

我想创建一个应用,允许用户使用不同的网页浏览登录多个帐户

例如,我有2个WebView 每个WebView都会加载相同的网站,例如gmail.com 用户可以在单独的WebView中使用单独的帐户登录。

但我面临的问题是2 WebView 始终登录到同一帐户

我搜索了很多,这里有一些相关的标题,
Facebook MultiLogin in Android Webview
Using WebView for multi-page login to website and fetch data
Multiple Log-Ins on Separate WebViews? (Android)
但仍未找到可接受的答案。

在Android中使用WebView是否可行? 我怎样才能实现我的目标?

2 个答案:

答案 0 :(得分:5)

棘手的部分是android.webkit.CookieManager,由WebView用于保存cookie,被设计为单身。这意味着每个Java / Dalvik进程只有一个CookieManager实例,同一进程内的多个WebView实例共享一组Cookie。

像@ToYonos提议的那样,你可以尝试覆盖某些钩子来解决这个问题,但我认为它不会100%有效......还要考虑android.webkit.WebStorage:它是另一个单!

也就是说,这可能会更可靠地处理:在清单中复制顶级WebView活动并将其分配给在不同进程中运行:

<activity
    android:name=".WebViewActivity" />
<activity
    android:name=".WebView1Activity"
    android:process=":web1" />
<activity
    android:name=".WebView2Activity"
    android:process=":web2" />
...

这样您就可以拥有独立的进程和不同的CookieManager / WebStorage实例。

但要注意:不同的WebStorage实例仍会写入app数据文件夹中的相同路径!这可以通过调用webView.getSettings().setDatabasePath()为不同的进程使用不同的数据库路径来解决,但是这个API在API级别19(KitKat)中已被弃用。只要您访问的网页没有使用HTML5本地存储,这应该没问题......

答案 1 :(得分:4)

我认为您必须实施自己的系统。你可以试试这样的东西:

private static final String DOMAIN = "http://cookiedomain.com";

private final Map<WebView, String> cookiesMap = new HashMap<WebView, String>();

// [...]

WebView w = new WebView(this);
// Loading url and stuff
w.setWebViewClient(new WebViewClient()
{
    public void onLoadResource (WebView view, String url)
    {
        // If cookies have already been stored for this WebView
        if (cookiesMap.get(view) != null)
        {
            CookieManager.getInstance().removeAllCookie();
            CookieManager.getInstance().setCookie(DOMAIN, cookiesMap.get(view));
        }
    }

    public void onPageFinished(WebView view, String url)
    {
        // Check if the url matches the after-login page or whatever you want
        boolean condition = ...;  
        if(condition)
        {
            // Getting new cookies
            String cookies = CookieManager.getInstance().getCookie(DOMAIN);
            cookiesMap.put(view, cookies);
        }
    }
});

// Do the same for the 2nd WebView

这是一个简单的例子,需要改进,但它可能是一个可持续解决方案的良好开端。

限制:

  • 仅当每个WebView不与其他WebView同时发出请求时,它才会起作用。否则,它肯定会纠结饼干。
  • 这仅适用于一个域