OkHttp3--CookieJar 持久化Cookie
Okhttp3默認(rèn)是不持久化Cookie的,想要持久化Cookie就要實(shí)現(xiàn)CookieJar接口,并且設(shè)置他
OkHttpClient.Builder builder = new OkHttpClient.Builder();
builder.cookieJar(new PersistenceCookieJar());
簡單實(shí)現(xiàn)CookieJar接口
public class PersistenceCookieJar implements CookieJar {
List<Cookie> cache = new ArrayList<>();
//Http請求結(jié)束,Response中有Cookie時(shí)候回調(diào)
@Override
public void saveFromResponse(HttpUrl url, List<Cookie> cookies) {
//內(nèi)存中緩存Cookie
cache.addAll(cookies);
}
//Http發(fā)送請求前回調(diào),Request中設(shè)置Cookie
@Override
public List<Cookie> loadForRequest(HttpUrl url) {
//過期的Cookie
List<Cookie> invalidCookies = new ArrayList<>();
//有效的Cookie
List<Cookie> validCookies = new ArrayList<>();
for (Cookie cookie : cache) {
if (cookie.expiresAt() < System.currentTimeMillis()) {
//判斷是否過期
invalidCookies.add(cookie);
} else if (cookie.matches(url)) {
//匹配Cookie對應(yīng)url
validCookies.add(cookie);
}
}
//緩存中移除過期的Cookie
cache.removeAll(invalidCookies);
//返回List<Cookie>讓Request進(jìn)行設(shè)置
return validCookies;
}
};
}
上面代碼只是在運(yùn)行時(shí)緩存了Cookie,當(dāng)App退出的時(shí)候Cookie就不存在了。所以我們可以改進(jìn)一下添加在本地中緩存Cookie的功能
Cookie中數(shù)據(jù)如何緩存到本地?
我們先來看看Okhttp3的Cookie類
public final class Cookie {
......
private final String name;
private final String value;
private final long expiresAt;
private final String domain;
private final String path;
private final boolean secure;
private final boolean httpOnly;
private final boolean persistent; // True if 'expires' or 'max-age' is present.
private final boolean hostOnly; // True unless 'domain' is present.
......
}
我們僅需緩存這些參數(shù)到本地就好了