OkHttp Cookie 管理

前言

关于 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<>();
//返回 uri 所有包含 key 的值
for (String key : cookieStore.keySet()) {
if (url.host().contains(key)) {
ret.addAll(cookieStore.get(key).values());
}
}
return ret;
}
})
.build();
---------------- The End ----------------
分享到: