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
投稿

猜你喜欢

  • Android中banner的使用步骤

    2023-07-04 17:47:23
  • Spring Cloud Gateway网关XSS过滤方式

    2021-08-07 13:16:53
  • JAVA实现长连接(含心跳检测Demo)

    2023-08-05 09:51:13
  • Java 通过反射给实体类赋值操作

    2023-11-26 10:11:41
  • Spring AOP实现接口请求记录到数据库的示例代码

    2023-08-15 19:14:05
  • Java IO流相关知识代码解析

    2023-08-05 05:48:04
  • es(elasticsearch)整合SpringCloud(SpringBoot)搭建教程详解

    2023-12-06 07:34:14
  • Mybatis环境搭建及文件配置过程解析

    2021-07-04 22:37:03
  • Android实现屏幕旋转四个方向准确监听

    2022-06-07 08:57:32
  • Android中外接键盘的检测的实现

    2023-07-27 21:15:13
  • Java基础之容器Vector详解

    2023-11-25 13:10:07
  • WinFrom中label背景透明的实现方法

    2023-05-08 13:05:40
  • SpringBoot 多Profile使用与切换方式

    2022-04-13 14:58:27
  • Java与C++分别用递归实现汉诺塔详解

    2021-10-23 01:28:59
  • 深入探索Java常量池

    2022-12-28 00:55:53
  • swing分割窗口控件JSplitPane使用方法详解

    2021-07-28 14:15:20
  • Java @Deprecated注解的作用及传递性

    2023-08-11 12:55:05
  • C# 屏蔽关键字的实现方法

    2023-10-10 15:15:50
  • Spring createBeanInstance实例化Bean

    2023-06-17 17:26:27
  • JavaFX实现UI美观效果代码实例

    2021-08-27 21:02:15
  • asp之家 软件编程 m.aspxhome.com