-
-
Notifications
You must be signed in to change notification settings - Fork 458
Cookie管理
1、使用RxHttp自动的Cookie管理功能前,请确认你的服务器采用了http标准协议,即Cookie存储在响应头的Set-Cookie
字段中,如下:
Set-Cookie: JSESSIONID=6B1B904EC42DFFFFDB3AEA299DA13AC2; Path=/; Secure; HttpOnly
如果不是,则需要做额外处理,请看下文
2、RxHttp提供的磁盘缓存方案,需要开发者传入磁盘存储路径,建议传入单独的路径,千万不要传入与RxHttp网络缓存同样的路径,否则将会出现意想不到的结果,比如:清缓存时,会将两种缓存同时清除
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。
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
当你在构建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接口对象,则上面代码强转将会失败
如果你的服务器,下发的cookie未采用标准协议,即cookie不在Set-Cookie
响应头中,则可以通过拦截器,自己去解析服务器下发的cookie,然后通过上面介绍的方式,手动添加到CookieStore对象中,下次请求便会自动带上。