【问题标题】:Switch between account sessions within one WebView在一个 WebView 中的帐户会话之间切换
【发布时间】:2013-09-24 06:13:44
【问题描述】:

我想执行以下流程:

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

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

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

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

现在我想允许在用户操作时在 account1 和 account2 会话之间切换。

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

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

这没有用。所以我尝试在加载 url 之前使用 Javascript 注入 cookie,这也不起作用,我的意思是没有会话可用,我已经返回到 Gmail 登录屏幕。

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

【问题讨论】:

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


    【解决方案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);
    

    【讨论】:

    • 看起来很有趣...我会在接下来的几天内尝试一下。你能让这种事情发挥作用吗?
    • 在我的情况下是通过 webview 进行身份验证/登录并返回到我的本机应用程序并使用由 webview 创建的相同会话,我需要在 webservice(Http) 调用中使用。所以这个解决方案对我有用。我正在使用 webview 生成的 cookie 列表和我的“HttpClient”,它就像魅力一样。
    • 听起来很有希望...我会在周末测试这个,谢谢。
    • 我还没来得及测试它,只是为了努力:)
    猜你喜欢
    • 1970-01-01
    • 2021-01-23
    • 2012-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 2012-07-12
    • 1970-01-01
    相关资源
    最近更新 更多