android中有时候需要保存由服务器返回的cookie,那么如何存取呐?
这需要我们自定义两个拦截器来实现
SaveCookiesInterceptor和AddCookiesInterceptor
首先定义响应拦截器,该拦截器实现从response获取set-cookie字段的值,并将其保存在本地。

代码如下:

public class SaveCookiesInterceptor implements Interceptor {    private static final String COOKIE_PREF = "cookies_prefs";    private Context mContext;    public SaveCookiesInterceptor(Context context) {        mContext = context;    }    @Override    public Response intercept(Chain chain) throws IOException {        Request request = chain.request();        Response response = chain.proceed(request);        //set-cookie可能为多个        if (!response.headers("set-cookie").isEmpty()) {            List cookies = response.headers("set-cookie");            String cookie = encodeCookie(cookies);            saveCookie(request.url().toString(),"gfan.com",cookie);        }        return response;    }    //整合cookie为唯一字符串    private String encodeCookie(List cookies) {        StringBuilder sb = new StringBuilder();        Set set=new HashSet<>();        for (String cookie : cookies) {            String[] arr = cookie.split(";");            for (String s : arr) {                if(set.contains(s))continue;                set.add(s);            }        }        Iterator ite = set.iterator();        while (ite.hasNext()) {            String cookie = ite.next();            sb.append(cookie).append(";");        }        int last = sb.lastIndexOf(";");        if (sb.length() - 1 == last) {            sb.deleteCharAt(last);        }        return sb.toString();    }    //保存cookie到本地,这里我们分别为该url和host设置相同的cookie,其中host可选    //这样能使得该cookie的应用范围更广    private void saveCookie(String url,String domain,String cookies) {        SharedPreferences sp = mContext.getSharedPreferences(COOKIE_PREF, Context.MODE_PRIVATE);        SharedPreferences.Editor editor = sp.edit();        if(url.contains("index.php?m=member&c=gfan_index&a=login")){            if (!TextUtils.isEmpty(domain)) {                editor.putString(domain, cookies);            }            editor.apply();        }    }}

其次定义请求拦截器,如果该请求存在cookie,则为其添加到Header的Cookie中,代码如下:

代码如下:

    public class AddCookiesInterceptor implements Interceptor {    private static final String COOKIE_PREF = "cookies_prefs";    private Context mContext;    public AddCookiesInterceptor(Context context) {        mContext = context;    }    @Override    public Response intercept(Chain chain) throws IOException {        Request request = chain.request();        Request.Builder builder = request.newBuilder();        String cookie = getCookie("", "gfan.com");        if (!TextUtils.isEmpty(cookie)) {            builder.removeHeader("cookie");            builder.addHeader("cookie", cookie);        }        return chain.proceed(builder.build());    }    private String getCookie(String url, String domain) {        SharedPreferences sp = mContext.getSharedPreferences(COOKIE_PREF, Context.MODE_PRIVATE);        if (!TextUtils.isEmpty(domain)&&sp.contains(domain) && !TextUtils.isEmpty(sp.getString(domain, ""))) {            return sp.getString(domain, "");        }        return null;    }}

最后在设置一下这两个拦截器即可

代码如下:

OkHttpClient.Builder builder = new OkHttpClient.Builder();        builder.connectTimeout(TIME_OUT, TimeUnit.SECONDS);        builder.addInterceptor(new AddCookiesInterceptor(MYApplication.appContext));        builder.addInterceptor(new SaveCookiesInterceptor(MYApplication.appContext));     ```   参考文章:[急速开发系列——Retrofit实现持久化Cookie的三种方案](http://www.2cto.com/kf/201609/548735.html)

更多相关文章

  1. Android(安卓)Binder总结
  2. XE5 Android(安卓)开发数据访问server端
  3. 用java1.6编译android-froyo
  4. 自动打开USB调试
  5. android和js互相调用的问题
  6. Eclipse下查看Android源代码
  7. Android(安卓)动态生成布局 (多层嵌套)
  8. Android两种不同的方法去实现图像的放大与缩小(很有帮助)
  9. Android使用代码实现左右半圆的按钮背景

随机推荐

  1. Android(安卓)模拟器访问局域网服务器
  2. Android开发 Fiddler抓包工具简介
  3. AIDL进程间通信
  4. Android使用webview控件加载本地html,通过
  5. android常见对话框(AlertDialog)总结 一
  6. Android(安卓)手机制式和网络类型 GSM/ED
  7. TextView通过获得dimens.xml中定义的大小
  8. android listview 删除item 刷新 notifyD
  9. android studio安装 虚拟机"VT-x is disa
  10. Android开发本地及网络Mp3音乐播放器(五)