idtitlesidebar_label
cookie
使用Cookie
使用Cookie

Cookie是由服务器端生成,发送给客户端(一般为浏览器),并以key-value形式处理和保存在客户端的一组数据。在下次请求同一域名网站时,会将该Cookie数据再次发送到服务端。

Forest从1.5.0-RC1版本开始支持Cookie,可以通过回调函数和拦截器两种方式来处理Cookie。

回调函数方式

在请求接口的参数列表中加入OnSaveCookieOnLoadCookie 回调函数

OnSaveCookie: 在请求响应成功后,需要保存Cookie时调用该回调函数

OnLoadCookie: 在发送请求前,需要加载Cookie时调用该回调函数

  1. /**
  2. * 登入接口(需要接受Cookie)
  3. */
  4. @Post("http://localhost:8080/login?username=foo")
  5. ForestResponse testLogin(@Body UserLoginDTO userLogin, OnSaveCookie onSaveCookie);
  6. /**
  7. * 登入后测试接口(需要传入Cookie)
  8. */
  9. @Post("http://localhost:8080/test")
  10. ForestResponse testAfterLogin(OnLoadCookie onLoadCookie);

Forest不会自动处理或持久化服务端传来的Cookie数据,需要自己在回调函数中接到Cookie后自行处理。

  1. AtomicReference<ForestCookie> cookieAtomic = new AtomicReference<>(null);
  2. // 调用登入接口
  3. testClient.testLogin(userLogin, (request, cookies) -> {
  4. // 将服务端传来的Cookie放入cookieAtomic
  5. cookieAtomic.set(cookies.allCookies().get(0));
  6. });
  7. // 获取Cookie
  8. ForestCookie cookie = cookieAtomic.get();
  9. // 调用登入后的测试接口
  10. ForestResponse response = testClient.testAfterLogin((request, cookies) -> {
  11. // 将之前调用登入接口获得的Cookie传入请求发送到服务端
  12. cookies.addCookie(cookie);
  13. });

拦截器方式

拦截器方式原理上和回调函数方式一样,只不过OnSaveCookieOnLoadCookie 回调函数接口变成了拦截器中的 onSaveCookie(ForestRequest, ForestCookies) 方法和 onLoadCookie(ForestRequest, ForestCookies) 方法。

  1. /**
  2. * 处理Cookie的拦截器
  3. */
  4. public class CookieInterceptor implements Interceptor {
  5. // Cookie在本地存储的缓存
  6. private Map<String, List<ForestCookie>> cookieCache = new ConcurrentHashMap<>();
  7. /**
  8. * 在请求响应成功后,需要保存Cookie时调用该方法
  9. *
  10. * @param request Forest请求对象
  11. * @param cookies Cookie集合,通过响应返回的Cookie都从该集合获取
  12. */
  13. @Override
  14. public void onSaveCookie(ForestRequest request, ForestCookies cookies) {
  15. // 获取请求URI的主机名
  16. String host = request.getURI().getHost();
  17. // 将从服务端获得的Cookie列表放入缓存,主机名作为Key
  18. cookieCache.put(host, cookies.allCookies());
  19. }
  20. /**
  21. * 在发送请求前,需要加载Cookie时调用该方法
  22. *
  23. * @param request Forest请求对象
  24. * @param cookies Cookie集合, 需要通过请求发送的Cookie都添加到该集合
  25. */
  26. @Override
  27. public void onLoadCookie(ForestRequest request, ForestCookies cookies) {
  28. // 获取请求URI的主机名
  29. String host = request.getURI().getHost();
  30. // 从缓存中获取之前获得的Cookie列表,主机名作为Key
  31. List<ForestCookie> cookieList = cookieCache.get(host);
  32. // 将缓存中的Cookie列表添加到请求Cookie列表中,准备发送到服务端
  33. cookies.addAllCookies(cookieList);
  34. }
  35. @Override
  36. public void onError(ForestRuntimeException ex, ForestRequest request, ForestResponse response) {
  37. // ... ...
  38. }
  39. @Override
  40. public void onSuccess(Object data, ForestRequest request, ForestResponse response) {
  41. // ... ...
  42. }
  43. }