🍪 使用Cookie
Cookie是由服务器端生成,发送给客户端(一般为浏览器),并以key-value形式处理和保存在客户端的一组数据。在下次请求同一域名网站时,会将该Cookie数据再次发送到服务端。
Forest从1.5.0-RC1
版本开始支持Cookie,可以通过回调函数和拦截器两种方式来处理Cookie。
# 回调函数方式
在请求接口的参数列表中加入OnSaveCookie
和 OnLoadCookie
回调函数
OnSaveCookie
: 在请求响应成功后,需要保存Cookie时调用该回调函数
OnLoadCookie
: 在发送请求前,需要加载Cookie时调用该回调函数
/**
* 登入接口(需要接受Cookie)
*/
@Post("http://localhost:8080/login?username=foo")
ForestResponse testLogin(@Body UserLoginDTO userLogin, OnSaveCookie onSaveCookie);
/**
* 登入后测试接口(需要传入Cookie)
*/
@Post("http://localhost:8080/test")
ForestResponse testAfterLogin(OnLoadCookie onLoadCookie);
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
Forest不会自动处理或持久化服务端传来的Cookie数据,需要自己在回调函数中接到Cookie后自行处理。
AtomicReference<ForestCookie> cookieAtomic = new AtomicReference<>(null);
// 调用登入接口
testClient.testLogin(userLogin, (request, cookies) -> {
// 将服务端传来的Cookie放入cookieAtomic
cookieAtomic.set(cookies.allCookies().get(0));
});
// 获取Cookie
ForestCookie cookie = cookieAtomic.get();
// 调用登入后的测试接口
ForestResponse response = testClient.testAfterLogin((request, cookies) -> {
// 将之前调用登入接口获得的Cookie传入请求发送到服务端
cookies.addCookie(cookie);
});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 拦截器方式
拦截器方式原理上和回调函数方式一样,只不过OnSaveCookie
和 OnLoadCookie
回调函数接口变成了拦截器中的 onSaveCookie(ForestRequest, ForestCookies)
方法和 onLoadCookie(ForestRequest, ForestCookies)
方法。
/**
* 处理Cookie的拦截器
*/
public class CookieInterceptor implements Interceptor {
// Cookie在本地存储的缓存
private Map<String, List<ForestCookie>> cookieCache = new ConcurrentHashMap<>();
/**
* 在请求响应成功后,需要保存Cookie时调用该方法
*
* @param request Forest请求对象
* @param cookies Cookie集合,通过响应返回的Cookie都从该集合获取
*/
@Override
public void onSaveCookie(ForestRequest request, ForestCookies cookies) {
// 获取请求URI的主机名
String host = request.getURI().getHost();
// 将从服务端获得的Cookie列表放入缓存,主机名作为Key
cookieCache.put(host, cookies.allCookies());
}
/**
* 在发送请求前,需要加载Cookie时调用该方法
*
* @param request Forest请求对象
* @param cookies Cookie集合, 需要通过请求发送的Cookie都添加到该集合
*/
@Override
public void onLoadCookie(ForestRequest request, ForestCookies cookies) {
// 获取请求URI的主机名
String host = request.getURI().getHost();
// 从缓存中获取之前获得的Cookie列表,主机名作为Key
List<ForestCookie> cookieList = cookieCache.get(host);
// 将缓存中的Cookie列表添加到请求Cookie列表中,准备发送到服务端
// 默认情况下,只有符合条件 (和请求同域名、同URL路径、未过期) 的 Cookie 才能被添加到请求中
cookies.addAllCookies(cookieList);
}
@Override
public void onError(ForestRuntimeException ex, ForestRequest request, ForestResponse response) {
// ... ...
}
@Override
public void onSuccess(Object data, ForestRequest request, ForestResponse response) {
// ... ...
}
}
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# 严格匹配模式 (v1.5.25)
默认情况下,只有符合条件 (和请求同域名、同URL路径、未过期) 的 Cookie 才能被添加到请求中
这是因为 Forest 的 Cookie 集合默认为严格匹配模式,如果想添加符合匹配要求的 Cookie,只需修改严格匹配为false
即可
@Override
public void onLoadCookie(ForestRequest request, ForestCookies cookies) {
cookies.strict(false) // 设置为非严格匹配模式
.addCookie(new ForestCookie("attr1", "foo")) // 不设域名,默认情况下也能添加
.addCookie(new ForestCookie("attr2", "bar")) // 不设域名,默认情况下也能添加
// 不设域名,只有在非严格匹配模式下可以添加到请求中
.addCookie(new ForestCookie("attr3", "foobar").setDomain("xxx.com"));
}
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
帮助我们改善此文档 (opens new window)
上次更新: 2024/02/27, 12:43:35