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

本文介绍了一种解决H5登录状态在Webview应用中无法持久化的方案。通过在退出后将H5的Cookie保存至本地数据库,在下次启动时重新加载这些Cookie至Webview,从而实现了登录状态的保持。

转载自:http://blog.youkuaiyun.com/u013704970/article/details/53735639

最近项目遇到一个新需求,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);
        }
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

以上的代码是从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);
        }
    }
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37

我的数据库:

@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
}
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

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

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值