cookie:
public interface CookieStore { /** 保存url对应所有cookie */ void saveCookies(HttpUrl url, List<Cookie> cookie); /** 加载url所有的cookie */ List<Cookie> loadCookies(HttpUrl url); /** 获取当前所有保存的cookie */ List<Cookie> getAllCookie(); /** 根据url和cookie移除对应的cookie */ boolean removeCookie(HttpUrl url, Cookie cookie); /** 根据url移除所有的cookie */ boolean removeCookies(HttpUrl url); /** 移除所有的cookie */ boolean removeAllCookie(); }
public class PersistentCookieStore implements CookieStore { private static final String LOG_TAG = "PersistentCookieStore"; private static final String COOKIE_PREFS = "okgo_cookie"; //cookie使用prefs保存 private static final String COOKIE_NAME_PREFIX = "cookie_"; //cookie持久化的统一前缀 private final HashMap<String, ConcurrentHashMap<String, Cookie>> cookies; private final SharedPreferences cookiePrefs; public PersistentCookieStore() { cookiePrefs = OkGo.getContext().getSharedPreferences(COOKIE_PREFS, Context.MODE_PRIVATE); cookies = new HashMap<>(); //将持久化的cookies缓存到内存中,数据结构为 Map<Url.host, Map<Cookie.name, Cookie>> Map<String, ?> prefsMap = cookiePrefs.getAll(); for (Map.Entry<String, ?> entry : prefsMap.entrySet()) { if ((entry.getValue()) != null && !entry.getKey().startsWith(COOKIE_NAME_PREFIX)) { //获取url对应的所有cookie的key,用","分割 String[] cookieNames = TextUtils.split((String) entry.getValue(), ","); for (String name : cookieNames) { //根据对应cookie的Key,从xml中获取cookie的真实值 String encodedCookie = cookiePrefs.getString(COOKIE_NAME_PREFIX + name, null); if (encodedCookie != null) { Cookie decodedCookie = decodeCookie(encodedCookie); if (decodedCookie != null) { if (!cookies.containsKey(entry.getKey())) cookies.put(entry.getKey(), new ConcurrentHashMap<String, Cookie>()); cookies.get(entry.getKey()).put(name, decodedCookie); } } } } } } private String getCookieToken(Cookie cookie) { return cookie.name() + "@" + cookie.domain(); } /** 当前cookie是否过期 */ private static boolean isCookieExpired(Cookie cookie) { return cookie.expiresAt() < System.currentTimeMillis(); } /** 根据当前url获取所有需要的cookie,只返回没有过期的cookie */ @Override public List<Cookie> loadCookies(HttpUrl url) { ArrayList<Cookie> ret = new ArrayList<>(); if (cookies.containsKey(url.host())) { Collection<Cookie> urlCookies = cookies.get(url.host()).values(); for (Cookie cookie : urlCookies) { if (isCookieExpired(cookie)) { removeCookie(url, cookie); } else { ret.add(cookie); } } } return ret; } /** 将url的所有Cookie保存在本地 */