前言
关于 okhttp3 的 cookie 自动管理,搜索发现网上大多都是通过 url.host()
来当 key 存进 map 里面,这样使用 cookie 无法对应域名使用。
问题
先看一段网上的代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| OkHttpClient client = new OkHttpClient.Builder() .cookieJar(new CookieJar() { private final HashMap<HttpUrl, List<Cookie>> cookieStore = new HashMap<>();
@Override public void saveFromResponse(HttpUrl url, List<Cookie> cookies) { cookieStore.put(url.host(), cookies); }
@Override public List<Cookie> loadForRequest(HttpUrl url) { List<Cookie> cookies = cookieStore.get(url.host()); return cookies != null ? cookies : new ArrayList<Cookie>(); } }) .build();
|
这里使用的是 url.host()
,也就是请求的 url ,而不是 cookie 返回的 domain ,这样导致无法跨域名使用,还是出现覆盖的问题。
解决方法
使用 cookie.domain()
来当 key 来存储,代码如下,这里没有使用持久化
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| OkHttpClient client = new OkHttpClient.Builder() .cookieJar(new CookieJar() { private final HashMap<String, ConcurrentHashMap<String, Cookie>> cookieStore = new HashMap<>();
@Override public void saveFromResponse(HttpUrl url, List<Cookie> cookies) {
if (cookies != null && cookies.size() > 0) { for (Cookie cookie : cookies) { if (cookieStore.get(cookie.domain()) == null) { cookieStore.put(cookie.domain(), new ConcurrentHashMap<>()); } cookieStore.get(cookie.domain()).put(cookie.name(), cookie); } } }
@Override public List<Cookie> loadForRequest(HttpUrl url) { ArrayList<Cookie> ret = new ArrayList<>(); for (String key : cookieStore.keySet()) { if (url.host().contains(key)) { ret.addAll(cookieStore.get(key).values()); } } return ret; } }) .build();
|