Android开发——webview获取H5的Cookie并保存在本地

     最近项目遇到一个新需求,H5的登录态跟APP的登录态分开,所以需要记住H5的登录状态,但是我的webview app已退出再次打开,cookie就被清空(这个找了很久也没会找到原因)。我的解决方法是:获取H5的cookie,保存在本地数据库,·再次进入webview判断是否有Cookie,如果没有,从本地数据库取出Cookie并设置给webview。

     webview管理cookie的机制:将域名和cookie存在数据库中,当webview访问该域下面的网页时就会将该域名相关的cookie带上。所以我们的本地数据库应该将域名和cookie的key做为主键,从H5获取Cookie并解析出键值对存到本地数据库,重新打开webview时如果没有cookie,从本地数据库中取出相应域名的cookie设置给webview。

获取H5cookie并保存的代码如下:

@Override
        public void onPageFinished(WebView view, String url) {
            LogUtil.i(TAG, "onPageFinished:" + url);
            CookieSyncManager.createInstance(mActivity);
            CookieManager cookieManager = CookieManager.getInstance();
            String cookie = cookieManager.getCookie(url);//从H5获取cookie
            LogUtil.i(TAG, "onPageFinished cookie :" + cookie);
            CookieSyncManager.getInstance().sync();

            //将cookie存到数据库
            if(!TextUtils.isEmpty(cookie)){
                String[] cookies = cookie.split(";");
                for(int i=0;i
                    String item = cookies[i];
                    int index = item.indexOf("=");
                    WebViewBean bean = new WebViewBean(); 
                    bean.hostStr = mHost;
                    bean.cookieName = item.substring(0, index);
                    bean.cookieValue = item.substring(index+1);
                    DBHelper.getDatabaseDAO().insert(bean, WebViewBean.class);
                }
            }
            super.onPageFinished(view, url);
        }

以上的代码是从H5获取cookie并存储到本地数据库。hostStr 和cookieName 这两个是主键。

再次打开webview对cookie进行初始化代码:

/**
     * 初始化cookie信息
     */
    private void initCookie() {
    //获取网页的域名
        try {
            URL u = new URL(url);
            mHost = u.getHost();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
        //获取页面的cookie
        CookieManager cookieManager = CookieManager.getInstance();
        cookieManager.setAcceptCookie(true);
        String oldCookie = cookieManager.getCookie(url);
        LogUtil.i(TAG, "onPageFinished old cookie :" + oldCookie);


        //如果没有cookie从本地数据库中取出
        if(TextUtils.isEmpty(oldCookie)) {
            ArrayList query = DBHelper.getDatabaseDAO().query("hostStr='" + mHost + "'", WebViewBean.class);
            //设置给webview
            if(null != query && query.size() > 0){
                for (int i=0;i"=" + value;
                    cookieManager.setCookie(mHost, coo);
                }
                CookieSyncManager.getInstance().sync();
            }

            String addedCookie = cookieManager.getCookie(url);
            LogUtil.i(TAG, "onPageFinished added cookie :" + addedCookie);
        }
    }

我的数据库:

@Table(name="tb_WebViewBean")
public class WebViewBean {

    @PK
    @Column(name="hostStr")
    public String hostStr;//cookie

    @PK
    @Column(name="cookieName")
    public String cookieName;//cookieName 

    @Column(name="cookieValue")
    public String cookieValue;//cookieValue
}

用的数据库框架:lib_anotation
参考博客:http://zlping.iteye.com/blog/1633213

你可能感兴趣的:(Android开发)