OkHttp3--CookieJar 持久化Cookie
Okhttp3默認是不持久化Cookie的,想要持久化Cookie就要實現(xiàn)CookieJar接口,并且設置他
OkHttpClient.Builder builder = new OkHttpClient.Builder();
builder.cookieJar(new PersistenceCookieJar());
簡單實現(xiàn)CookieJar接口
public class PersistenceCookieJar implements CookieJar {
List<Cookie> cache = new ArrayList<>();
//Http請求結束,Response中有Cookie時候回調
@Override
public void saveFromResponse(HttpUrl url, List<Cookie> cookies) {
//內存中緩存Cookie
cache.addAll(cookies);
}
//Http發(fā)送請求前回調,Request中設置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對應url
validCookies.add(cookie);
}
}
//緩存中移除過期的Cookie
cache.removeAll(invalidCookies);
//返回List<Cookie>讓Request進行設置
return validCookies;
}
};
}
上面代碼只是在運行時緩存了Cookie,當App退出的時候Cookie就不存在了。所以我們可以改進一下添加在本地中緩存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ù)到本地就好了