先写个类继承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() + "")
}
}
}
}