OkHttp自定义CookieJar发起后续请求未携带全部Cookie问题
问题根因
你自定义实现的CookieJar完全不符合RFC 6265规定的Cookie管理规范,核心错误有两点:
- Cookie存储逻辑错误
你直接使用响应URL的host作为Key,将每次响应返回的Cookie全量覆盖该Key下的存储列表,没有做新旧Cookie的合并逻辑:只要后续同域名的任意响应返回了新的Cookie列表,就会直接覆盖之前存储的完整Cookie,导致部分Cookie丢失。
比如你登录接口返回了4个Cookie存储到svapp.contoso.com对应的列表中,后续重定向到/wf/htmlnavigator/launch的响应如果仅返回JSESSIONID和CONTOSO_USER两个Cookie,你直接就把之前存储的4个Cookie覆盖成2个,后续请求自然只能拿到这两个。 - Cookie匹配逻辑完全缺失
你loadForRequest方法仅做了请求host与存储Key的精确匹配,没有实现规范要求的域匹配、路径匹配、安全属性校验逻辑:
- 标注
domain=.contoso.com的Cookie按规范应该适配所有contoso.com的子域名请求,但你的逻辑只能在请求host完全等于svapp.contoso.com时才能拿到这些Cookie,如果后续请求域名是其他子域名(比如xxx.contoso.com),完全取不到对应Cookie。 - 未校验Cookie的
path、secure、过期时间等属性,可能发送不符合规则的Cookie,或者漏发符合规则的Cookie。
修复方案
不需要自行实现CookieJar,直接使用OkHttp官方提供的JavaNetCookieJar即可,它已经完整实现了所有Cookie规范要求的逻辑,示例代码如下:
import okhttp3.JavaNetCookieJar; import java.net.CookieManager; import java.net.CookiePolicy; // 初始化系统Cookie管理器,设置接受所有Cookie CookieManager cookieManager = new CookieManager(); cookieManager.setCookiePolicy(CookiePolicy.ACCEPT_ALL); // 直接使用官方CookieJar实现 CookieJar cookieJar = new JavaNetCookieJar(cookieManager); OkHttpClient client = new OkHttpClient.Builder() .addNetworkInterceptor(new LoggingInterceptor()) .cookieJar(cookieJar) .build();
内容的提问来源于stack exchange,提问作者Al Grant
相关产品推荐
相关产品推荐

