okhttp自带一个cookie管理器
public static OkHttpClient getClient() {
if (client == null) {
synchronized (OkHttpClient.class) {
if (client == null) {
HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
logging.setLevel(HttpLoggingInterceptor.Level.BODY);
client = new OkHttpClient.Builder()
.cookieJar(new CookieJar() {
private static HashMap<String, List<Cookie>> cookieStore = new HashMap<>();
@Override
public void saveFromResponse(HttpUrl url, List<Cookie> cookies) {
cookieStore.put(url.host(), cookies);
Log.i(TAG, "saveFromResponse: cookies="+cookies);
}
}
@Override
public List<Cookie> loadForRequest(HttpUrl url) {
List<Cookie> cookies = cookieStore.get(url.host());
if (cookies != null) {
LogUtil.i(TAG, "loadForRequest: cookies=" + cookies);
}
return cookies != null ? cookies : new ArrayList<>();
}
})
.addInterceptor(logging)
.readTimeout(10000, TimeUnit.MILLISECONDS)
.writeTimeout(10000, TimeUnit.MILLISECONDS)
.connectTimeout(10000, TimeUnit.MILLISECONDS)
.build();
}
}
}
return client;
}
在saveFromResponse()方法,会更新存储新的cookie到cookieStore中
在loadForRequest()方法,每次加载网络请求,都会从map中读取cookie并添加
在okHttp3中,cookie是以List为单位使用,一般包括两个元素
在cookie中expiresat或者max_age标签会涉及到cookie的生命周期
cookie.setmaxage设置为0时,会马上在浏览器上删除指定的cookie
cookie.setmaxage设置为-1时,代表关闭当前浏览器即失效。
其他正数数值,代表生命周期(单位秒)
目前cookie,没有生命周期(max_age为0)
因此只要保证把获取到的cookie持久化保存,每次登陆的时候从本地读取cookie即可
同时为了性能考虑,同时维护一个cookieJar,只有当每次活动重启,通过新建cookieJar获取不到cookie时,从本地获取,并添加到cookiejar中
//这里是用来维护每次新建活动的cookieJar的cookieMap
private static HashMap<String, List<Cookie>> cookieStore = new HashMap<>();
new CookieJar() {
@Override
public void saveFromResponse(HttpUrl url, List<Cookie> cookies) {
cookieStore.put(url.host(), cookies);
Log.i(TAG, "saveFromResponse: cookies="+cookies);
//这里用到了litePal数据库来存储cookies,每次存储需要清空以前的历史cookies
LitePal.deleteAll(MyCookie.class);
for (Cookie data :
cookies) {
//由于okhttp3.Cookie是final类,无法继承重写,因此,自己定义了一个JavaBean来保存cookie信息
MyCookie myCookie=new MyCookie(data);
myCookie.save();
}
}
@Override
public List<Cookie> loadForRequest(HttpUrl url) {
List<Cookie> cookies = cookieStore.get(url.host());
if (cookies != null) {
Log.i(TAG, "loadForRequest: cookies=" + cookies);
return cookies;
}else {
//当本地获取不到的时候,通过全局application的静态方法,来从数据库获取cookie,同时存入新建的cookieMap
Log.i(TAG, "loadForRequest: cookies=null" );
cookies=MyApplication.getCookie();
cookieStore.put(url.host(),cookies);
return cookies;
}
}
}
MyApplication类
public static List<Cookie> getCookie(){
List<Cookie> cookies=new ArrayList<>();
List<MyCookie> myCookies = LitePal.findAll(MyCookie.class);
if (myCookies.size()==0){
return new ArrayList<>();
}
for (MyCookie data :
myCookies) {
cookies.add(data.getCookie());
}
return cookies;
}
MyCookie类
public class MyCookie extends LitePalSupport {
private String name;
private String value;
private long expiresAt;
private String domain;
private String path;
private boolean secure;
private boolean httpOnly;
private boolean persistent; // True if 'expires' or 'max-age' is present.
private boolean hostOnly; // True unless 'domain' is present.
public MyCookie() {
}
public MyCookie(Cookie cookie) {
this.name = cookie.name();
this.value = cookie.value();
this.expiresAt = cookie.expiresAt();
this.domain = cookie.domain();
this.path = cookie.path();
this.secure = cookie.secure();
this.httpOnly = cookie.httpOnly();
this.persistent = cookie.persistent();
this.hostOnly = cookie.hostOnly();
}
public Cookie getCookie(){
Cookie.Builder builder=new Cookie.Builder();
builder.name(name)
.value(value)
.expiresAt(expiresAt)
.domain(domain)
.path(path);
if (secure){
builder.secure();
}
if (httpOnly){
builder.httpOnly();
}
if (hostOnly){
builder.httpOnly();
}
return builder.build();
}
}