美文网首页
OkHttp3 默认不保持 Cookie 的解决方案

OkHttp3 默认不保持 Cookie 的解决方案

作者: 云之外 | 来源:发表于2016-11-26 13:36 被阅读2401次

    OkHttp3 声明的 OkHttpClient 默认不保存 Cookie,不发送 Cookie。在实际开发中会丢失 Session ID 造成服务器无法判断当前用户的登录状态。查阅多方资料后给出解决办法。

    三点概念:

    1. 首次与服务器建立连接时,服务器生成 SessionID 标记当前连接会话。(HTTP 是无连接协议)
    2. 客户端 request 时,将 带有 SessionID 的 Cookie 发送至服务器,以此作为会话标记。
    3. 在实际使用 OkHttp3 时,通常一个 Application 只使用 一个 OkHttpClient 实例进行连接。

    解决方案:

    1. 构建 CookieJar 对象,并重写 saveFromResponse 和 loadFromRequest 方法。

    2. 使用构建了 CookieJar 的 OkHttpClient 实例收发 Http 连接。

    3. 本程序中使用了单例模式构造 OkHttpClient 实例,Cookie 持久化代码如下:

      mOkHttpClient = new OkHttpClient.Builder()
                      .cookieJar(new CookieJar() {
                          private final HashMap<String, 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();
      

    相关文章

      网友评论

          本文标题:OkHttp3 默认不保持 Cookie 的解决方案

          本文链接:https://www.haomeiwen.com/subject/pofgpttx.html