首页 > 系统 > Android > 正文

OkHttp3中默认不保持Cookie的解决方法

2019-10-22 18:12:41
字体:
来源:转载
供稿:网友

OKhttp3中的cookies

OkHttpClient client = new OkHttpClient().newBuilder().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();

主要就是实现CookieJar接口,在OkHttpClient构建的时候。

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

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

三点概念:

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

解决方案:

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

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

本程序中使用了单例模式构造 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();

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对VEVB武林网的支持。


注:相关教程知识阅读请移步到Android开发频道。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表