解决android cookie本地存储,持久化

先写个类继承cookiejar,然后 

然后设置到okhttpClient.Builder中

    private OkHttpClient.Builder mOkHttpClientBuilder = getOkHttpClientBuilderTimeout()
                .cache(cache)
                .cookieJar(new MyCookieJar())
                .addInterceptor(new MyInterceptor());

下面是MyCookieJar代码


import android.text.TextUtils
import com.dianmei.baselibrary.util.CommonUtil
import com.dianmei.global.helper.DataHelper
import com.dianmei.global.util.SpUtils
import okhttp3.Cookie
import okhttp3.CookieJar
import okhttp3.HttpUrl
import com.franmontiel.persistentcookiejar.persistence.SerializableCookie
class MyCookieJar : CookieJar {
    companion object {
        private var spUtils: SpUtils = SpUtils(DataHelper.context)
        @JvmField
        val cookieKeys = "COOKIE_KEY"  //把这个存起来,到webview的时候可以通过key遍历本地存储的cookie

        /**
         * 必须同步,避免 数组角标越界
         */
        @Synchronized
        fun addCookie(url: String, cookies: MutableList<Cookie>) {
            var sb = StringBuffer()
            if (!CommonUtil.isEmpty(cookies)) {
                for (i in cookies.indices) {
                    cookies[i].let {
                        sb = sb.append(SerializableCookie().encode(it)).append("|")
                    }
                }
                spUtils.saveData(url, sb.toString())
                spUtils.getData(cookieKeys, "").let {
                    val tempSet = HashSet<String>()
                    val cookieKeyArr = it!!.split(",")
                    if (cookieKeyArr.isNotEmpty()) {
                        for (i in cookieKeyArr) {
                            if (!TextUtils.isEmpty(i)) {
                                tempSet.add(i)
                            }
                        }
                    }
                    tempSet.add(url)
                    var sb = StringBuffer()
                    for (q in tempSet) {
                        sb = sb.append(q).append(",")
                    }
                    var result = ""
                    if (sb.get(sb.length - 1).toString().equals(",")) {
                        result = sb.substring(0, sb.length - 1)
                    } else {
                        result = sb.toString()
                    }

                   result
                    spUtils.saveData(cookieKeys, result!!)
                }


            }

        }

        @Synchronized
        fun getCookiesFromSp(encodedCookies: String): MutableList<Cookie> {
            var arr = encodedCookies.split("|")
            val resultCookies = ArrayList<Cookie>()
            for (i in arr) {
                if (!TextUtils.isEmpty(i)) {
                    val mCookie = SerializableCookie().decode(i)
                    resultCookies.add(mCookie)
                }
            }

            return resultCookies
        }
    }


    override fun loadForRequest(url: HttpUrl): MutableList<Cookie> {
        var result = spUtils.getData(url.host())
        if (!TextUtils.isEmpty(result)) {
            val cookies = getCookiesFromSp(result!!)
            if (!CommonUtil.isEmpty(cookies)) {
                return cookies
            } else {
                return ArrayList<Cookie>()
            }
        } else {
            return ArrayList<Cookie>()
        }
    }

    override fun saveFromResponse(url: HttpUrl, cookies: MutableList<Cookie>) {
        addCookie(url.host(), cookies)
    }

}

cookie本地存储的核心问题是怎么判断服务器 服务器要什么cookie

我这边是取httpurl的 host字段, debug发现刚好是服务器的ip,我拿这个做cookie的唯一标识存作为KEY存在sharedpreference里面

第二个问题就是怎么把cookie数组存在sharedpreference里面

网上代码一大堆,其实  有现成的api      首先通过httpurl给的事  cookie数组,  然后每个cookie有很多字段,这里不考虑cookie失效那些,等需求用到我再加. 那么先把服务器给的cookie数组遍历 ,然后  通过SerializableCookie的 decode方法把cookie转化成字符串

然后 每个cookie字符串 用"|" 隔开 用StringBuffer拼在一起就OK拉

下面是工具类 

SpUtils是个工具类,就是一个sharedPreference的封装,建议自己写
CommonUtil.isEmpty(cookies) 这个就是判断  cookies数组是否为空  建议自己写

今天顺便把cookie加在webview中

再初始化webview界面的时候

加入如下方法  loadurl之前

   fun synCookies() {
        val cookieKeys = SpUtils(activity!!).getData(MyCookieJar.cookieKeys)
        if (!TextUtils.isEmpty(cookieKeys)) {
            val cookieKeyArr = cookieKeys!!.split(",")
            var cookies = ArrayList<Cookie>()
            for (i in cookieKeyArr) {
                if(!TextUtils.isEmpty(i)) {
                    SpUtils(activity!!).getData(i)?.let {
                        cookies.addAll(MyCookieJar.getCookiesFromSp(it))
                    }

                }
            }

            val cookieManager = CookieManager.getInstance()
            cookieManager.setAcceptCookie(true)
            cookieManager.removeAllCookie()
            for (cookie in cookies) {
                if(cookie!=null) {
                    cookieManager.setCookie(cookie.domain() + "", cookie.name() + "=" + cookie.value() + "")
                }
            }
        }
    }

猜你喜欢

转载自blog.csdn.net/xiexiaotian11/article/details/89686387
今日推荐