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

作者:云之外 时间:2021-10-25 15:20:50 

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();

来源:https://www.jianshu.com/p/ddc0af82ed07

标签:okhttp3,cookie,不保持
0
投稿

猜你喜欢

  • java中文转全拼工具类分享

    2022-02-07 09:50:57
  • android 获取视频第一帧作为缩略图的方法

    2022-11-22 19:30:25
  • c# 二分查找算法

    2023-10-24 04:42:45
  • android中AutoCompleteTextView的简单用法(实现搜索历史)

    2023-01-08 18:33:01
  • 半小时实现Java手撸网络爬虫框架(附完整源码)

    2022-11-23 15:59:35
  • Java SSH 秘钥连接mysql数据库的方法

    2022-07-11 21:23:18
  • Android AS创建自定义布局案例详解

    2022-04-28 22:20:41
  • SpringCloud整合Nacos实现流程详解

    2021-07-04 11:11:09
  • C#中委托和事件的区别实例解析

    2022-07-03 09:28:39
  • C#(asp.net)多线程用法示例(可用于同时处理多个任务)

    2022-03-09 01:41:30
  • Kotlin协程低级api startCoroutine与ContinuationInterceptor

    2022-05-04 21:45:50
  • Flutter SizedBox布局组件Widget使用示例详解

    2022-02-08 18:19:44
  • java 如何实现正确的删除集合中的元素

    2022-08-03 17:44:31
  • Java KeyGenerator.generateKey的19个方法代码示例

    2022-08-08 14:26:40
  • C# 常用协议实现模版及FixedSizeReceiveFilter示例(SuperSocket入门)

    2023-12-12 04:17:48
  • springboot static关键字真能提高Bean的优先级(厉害了)

    2023-03-10 07:39:12
  • Android使用ViewPager实现启动引导页

    2023-02-03 12:28:28
  • 入门JDK集合之HashMap解析

    2023-11-24 02:45:03
  • Android实现可复用的筛选页面

    2023-02-23 09:41:27
  • C#对list列表进行随机排序的方法

    2021-10-31 20:00:17
  • asp之家 软件编程 m.aspxhome.com