OkHttp源码学习之CookieJar

664 阅读1分钟

作用

  • 管理 Cookie

    CookieJar 负责存储服务器发送的 Cookie,并在后续的请求中将 Cookie 添加到请求头中。 遵循 HTTP 的 Cookie 管理机制,包括域名、路径和过期时间等规则。

  • 提供灵活性

    开发者可以选择将 Cookie 保存在内存中、持久化到磁盘中,或者自定义存储机制。 可用于实现浏览器式的会话管理或持久化的登录状态。

  • 支持自动化处理

    自动将服务器返回的 Cookie 保存并附加到符合条件的请求中,避免手动管理。

CookieJar 源码

CookieJar 是一个接口,包含以下两个方法:

public interface CookieJar {
    void saveFromResponse(HttpUrl url, List<Cookie> cookies);
    List<Cookie> loadForRequest(HttpUrl url);
}

方法详解

  1. saveFromResponse(HttpUrl url, List<Cookie> cookies) :

    • 在接收到服务器响应时调用,用于存储从响应中提取的 Cookie。

    • 参数:

      • url: 发起请求的 URL。
      • cookies: 从响应头中解析出的 Cookie 列表。
  2. loadForRequest(HttpUrl url) :

    • 在发起请求时调用,用于加载与请求 URL 匹配的 Cookie。

    • 参数:

      • url: 当前请求的 URL。
    • 返回值:

      • 返回与请求 URL 相关的 Cookie 列表,这些 Cookie 会被添加到请求头中。
  3. 默认值 :

    CookieJar.NO_COOKIES

    • 一个空实现,表示不处理任何 Cookie。
    • 默认情况下,OkHttp 不会存储或发送 Cookie。

高级用法:持久化 Cookie

如果需要将 Cookie 保存到磁盘中(如实现长期会话),可以结合数据库或文件系统来实现。例如:

public class PersistentCookieJar implements CookieJar {
    private final CookieStore cookieStore;

    public PersistentCookieJar(CookieStore cookieStore) {
        this.cookieStore = cookieStore;
    }

    @Override
    public void saveFromResponse(HttpUrl url, List<Cookie> cookies) {
        cookieStore.add(url, cookies);
    }

    @Override
    public List<Cookie> loadForRequest(HttpUrl url) {
        return cookieStore.get(url);
    }
}