retrofit请求持久化Cookie

  今天给大家分享Retrofit2.0 OkHttp如何自动加载Cookie; Retrofit,话说Retrofit最近真的很火啊,Retrofit+OKHttp现在似乎已经成为了Android网络请求框架的主流框架了吧,大家以前用的可能是XUtils框架,个人感觉也不错,也更新到了Xutils3,但是Retrofit是Square出的, 所以一定要学习一下。

持久化Cookie

今天要讲的是,怎么持久化管理你的Cookie,也就是实现用户免登陆过程。
首先说一下需求,后台大哥哥是这样告诉我的:我们的用户登录需要你在本地管理cookie,用户下次进来的时候不需要再登录,调用其他接口的时候将用户的cookie和session放到请求头里面。我果断的答应了,因为之前用Xutils的时候也这么做过,当我去网上找资料的时候发现并没有很好的资料。因为Retrofit内部是Ok来实现的,所以方向可以找到Ok管理Cookie,好了,方向找到了,我们来看一下OKHttp:
OKHttp3.0之前和之后有很大的改动:


要想获取cookie,那么肯定有个入口区提供cookie,一般都是在app应用的第一次访问时候(如登录或者登录前的验证),由服务器通过响应头来返回的,然后客户端获取到cookie后再以后的访问中加入header中进行访问。

  • fiddler抓包 
    用工具抓包,获取接口信息,大概信息如下: 
    http://*****/updateToken 
    这里写图片描述


    这个就是服务端返回的信息,cookie在响应头中,一般用浏览器抓包时,会发现访问接口的时候,在请求头中竟然会出现cookie的配置,那么它是从哪来的呢,别怕,这是因为你之前在该浏览器中已经访问过了,它做了记录,所以有了之前的cookie。解决如下: 
    1.删除浏览器的cookie(经测试,没有成功,估计姿势不对) 
    2.用手机模拟请求,并且抓包(就是用的这种)

好了,第一次请求的返回头已经有了,那么在retrofit该如何获取呢?

获取cookie 
用retrofit当然得写拦截器,先贴上GetCookiesInterceptor代码

用于存储cookies

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. private  HashSet<String> cookies   = new HashSet<>();  
取得 cookies

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. public class ReceivedCookiesInterceptor implements Interceptor {  
  2.      @Override  
  3.      public okhttp3.Response intercept(Chain chain) throws IOException {  
  4.          okhttp3.Response originalResponse = chain.proceed(chain.request());  
  5.   
  6.          if (!originalResponse.headers("Set-Cookie").isEmpty()) {  
  7.   
  8.   
  9.              for (String header : originalResponse.headers("Set-Cookie")) {  
  10.                  cookies.add(header);  
  11.              }  
  12.          }  
  13.          return originalResponse;  
  14.      }  
  15.  }  

添加 cookies

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. public class AddCookiesInterceptor implements Interceptor {  
  2.   
  3.     @Override  
  4.     public okhttp3.Response intercept(Chain chain) throws IOException {  
  5.         Request.Builder builder = chain.request().newBuilder();  
  6.   
  7.         for (String cookie : cookies) {  
  8.             builder.addHeader("Cookie", cookie);  
  9.             Log.v("OkHttp""Adding Header: " + cookie); // This is done so I know which headers are being added; this interceptor is used after the normal logging of OkHttp  
  10.         }  
  11.   
  12.         return chain.proceed(builder.build());  
  13.     }  
  14. }  

okhttpClient Retrofix

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. okHttpClient = new OkHttpClient.Builder()  
  2.          .addInterceptor(new AddCookiesInterceptor())  
  3.          .addInterceptor(new ReceivedCookiesInterceptor())  
  4.   
  5.   
  6.          .connectTimeout(30, TimeUnit.SECONDS).build();  
  7.   
  8.   
  9.  //创建Retrofit对象  
  10.  retrofit = new Retrofit.Builder().baseUrl(Constant.BASE_URL)  
  11.          //配置转化库,默认是GSON  
  12.         // .addConverterFactory(GsonConverterFactory.create(gson))  
  13.          .addConverterFactory(GsonConverterFactory.create())  
  14.          //配置回调库,采用RxJava  
  15.          .addCallAdapterFactory(RxJavaCallAdapterFactory.create())  
  16.          .client(okHttpClient)  
  17.          .build();  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值