在一个WebView中的帐户会话之间切换

时间:2013-09-19 08:40:50

标签: android session webview android-webview session-cookies

我想执行以下流程:

  1. 使用 account1 打开网页浏览并登录Gmail,然后浏览一下。
  2. 以某种方式保存 account1 的当前会话和当前网址。

  3. 要使用 account2 登录,我需要处理 account1 的会话。

  4. 现在使用 account2 登录Gmail,然后浏览一下。

  5. 再次以某种方式保存 account2
  6. 的当前会话和当前网址。

    现在,我希望在用户操作后允许在 account1 account2 会话之间切换。

    由于我假设(也可能是错误的)会话由url,url params及其cookie确定,我已为每个帐户保存了所有内容,并且在切换时我已完成以下操作:

    // url == url + params
    CookieManager.getInstance().removeAllCookies();
    CookieManager.getInstance().setCookie(url, cookie);
    webview.loadUrl(url);
    

    哪个不起作用。所以我尝试在加载url之前使用Javascript注入cookie,这也没有用,因为没有用,我的意思是没有会话可用,我已经回到了Gmail登录界面。 / p>

    我该怎么做?我错过了什么?

1 个答案:

答案 0 :(得分:1)

试试这种方式

public List<Cookie>  sync(String url) {

        CookieManager cookieManager = CookieManager.getInstance();
        if (cookieManager == null)
            return null;

        RFC2109Spec cookieSpec = new RFC2109Spec();
        String rawCookieHeader = null;
        try {
            URL parsedURL = new URL(url);
            rawCookieHeader = cookieManager.getCookie(parsedURL.getHost());
            if (rawCookieHeader == null)
                return null;
            int port = parsedURL.getPort() == -1 ? parsedURL.getDefaultPort() : parsedURL.getPort();

            CookieOrigin cookieOrigin = new CookieOrigin(parsedURL.getHost(), port, "/", false);
            List<Cookie> cookies = cookieSpec.parse(new BasicHeader("set-cookie", rawCookieHeader), cookieOrigin);
            return cookies;
        } catch (Exception e) {

        }
        return null;
    }


    public void sync(List<Cookie> cookies,String url) {
        if (cookies != null) {

            CookieManager cookieManager = CookieManager.getInstance();
            cookieManager.setAcceptCookie(true);
            for (Cookie cookie : cookies) {

                Cookie sessionInfo = cookie;
                String cookieString = sessionInfo.getName() + "=" + sessionInfo.getValue() + "; domain=" + sessionInfo.getDomain();
                cookieManager.setCookie(url, cookieString);
                CookieSyncManager.getInstance().sync();
            }
        }
    }

请使用

webview.setWebViewClient(new WebViewClient(){
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                return super.shouldOverrideUrlLoading(view, url);
                sync(url); // store list of cookies in Global variable return by this function. 
            }
        });

        //before loading/swithich account

        //sync(yourglobalvariable of list of cookis, url of respective account);
        sync(cookies,urlAccount1);
        webview.loadUrl(url);