Skip to content

Cookie管理

liujingxing edited this page Jun 9, 2021 · 4 revisions

1、注意事项

1、使用RxHttp自动的Cookie管理功能前,请确认你的服务器采用了http标准协议,即Cookie存储在响应头的Set-Cookie字段中,如下:

Set-Cookie: JSESSIONID=6B1B904EC42DFFFFDB3AEA299DA13AC2; Path=/; Secure; HttpOnly

如果不是,则需要做额外处理,请看下文

2、RxHttp提供的磁盘缓存方案,需要开发者传入磁盘存储路径,建议传入单独的路径,千万不要传入与RxHttp网络缓存同样的路径,否则将会出现意想不到的结果,比如:清缓存时,会将两种缓存同时清除

2、使用

rxhttp 1.4.0版本中,引入了CookieStore类来自动管理Cookie,我们只需要在构建OkHttpClient时,传入CookieStore对象即可,如下:

OkHttpClient client = new OkHttpClient.Builder()                       
    .cookieJar(new CookieStore())        //使用CookieStore对象,自动管理cookie                      
    .connectTimeout(10, TimeUnit.SECONDS)                              
    .readTimeout(10, TimeUnit.SECONDS)                                 
    .writeTimeout(10, TimeUnit.SECONDS)                                
    .sslSocketFactory(sslSocketFactory, trustAllCert) //添加信任证书         
    .hostnameVerifier((hostname, session) -> true) //忽略host验证                              
    .build();                                                          
//RxHttp初始化,自定义OkHttpClient对象,非必须                                      
RxHttpPlugins.init(client);                                

以上代码,会解析响应头里的cookie,并自动存储,且下次发送请求时,自动带上cookie。

3、Cookie存储方式

CookieStore对象支持内存、磁盘缓存两种方式存储cookie,也可以两种方式同时缓存

仅内存缓存

CookieStore cookieStore = new CookieStore();

如果不带参数直接创建CookieStore对象,则默认是内存缓存,不会存储到磁盘

内存+磁盘缓存

File file = new File(context.getExternalCacheDir(), "RxHttpCookie");
CookieStore cookieStore = new CookieStore(file);

在构造方法中,传入磁盘缓存路径,就会开启磁盘缓存功能

仅磁盘缓存

File file = new File(context.getExternalCacheDir(), "RxHttpCookie");
CookieStore cookieStore = new CookieStore(file, false);

传入磁盘缓存路径的同时,再传入一个false参数即可。第二个参数,代表是否开启内存缓存,默认为true

4、手动管理Cookie

当你在构建OkHttpClient对象,传入CookieStore对象后,内部便会自动管理cookie;当然,我们也可以手动管理cookie,如下:

手动添加cookie

ICookieJar iCookieJar = (ICookieJar) RxHttpPlugins.getOkHttpClient().cookieJar();                 
HttpUrl httpUrl = HttpUrl.parse("https://www.wanandroid.com/");                            
String cookieStr = "JSESSIONID=6B1B904EC42DFFFFDB3AEA299DA13AC2; Path=/; Secure; HttpOnly";
Cookie cookie = Cookie.parse(httpUrl, cookieStr);   //通过parse方法构造Cookie对象,也可以通过构造器构造                                       
iCookieJar.saveCookie(httpUrl, cookie);                                                    

手动读取cookie

ICookieJar iCookieJar = (ICookieJar) RxHttpPlugins.getOkHttpClient().cookieJar();
HttpUrl httpUrl = HttpUrl.parse("https://www.wanandroid.com/");           
List<Cookie> cookies = iCookieJar.loadCookie(httpUrl); //读取到url对于的cookie                                        

手动移除cookie

ICookieJar iCookieJar = (ICookieJar) RxHttpPlugins.getOkHttpClient().cookieJar();
HttpUrl httpUrl = HttpUrl.parse("https://www.wanandroid.com/");           
iCookieJar.removeCookie(httpUrl);    //移除url对应的cookie                                     

手动移除所有cookie

ICookieJar iCookieJar = (ICookieJar) RxHttpPlugins.getOkHttpClient().cookieJar();    
iCookieJar.removeAllCookie(httpUrl); 

注:CookieStore对象实现了ICookieJar接口,ICookieJar接口继承okhttp3.CookieJar接口,如果在构建OkHttpClient对象时,传入的不是ICookieJar接口对象,则上面代码强转将会失败

5、非标准协议

如果你的服务器,下发的cookie未采用标准协议,即cookie不在Set-Cookie响应头中,则可以通过拦截器,自己去解析服务器下发的cookie,然后通过上面介绍的方式,手动添加到CookieStore对象中,下次请求便会自动带上。