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

来源:互联网 发布:php base64_encoder 编辑:程序博客网 时间:2024/06/10 08:58

     最近项目遇到一个新需求,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<cookies.length;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<WebViewBean> query = DBHelper.getDatabaseDAO().query("hostStr='" + mHost + "'", WebViewBean.class);            //设置给webview            if(null != query && query.size() > 0){                for (int i=0;i<query.size();i++){                    WebViewBean bean = query.get(i);                    String key = bean.cookieName;                    String value = bean.cookieValue;                    String coo = key + "=" + 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

0 0
原创粉丝点击