Android中如何保存cookie

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<String> cookies = response.headers("set-cookie");
            String cookie = encodeCookie(cookies);
            saveCookie(request.url().toString(),"gfan.com",cookie);
        }

        return response;
    }

    //整合cookie为唯一字符串
    private String encodeCookie(List<String> cookies) {
        StringBuilder sb = new StringBuilder();
        Set<String> set=new HashSet<>();
        for (String cookie : cookies) {
            String[] arr = cookie.split(";");
            for (String s : arr) {
                if(set.contains(s))continue;
                set.add(s);

            }
        }

        Iterator<String> 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)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,560评论 25 708
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,993评论 19 139
  • 又是一年中秋佳节,祝各位中秋节快乐。 今天我们来聊聊这个最近很火的网络请求库retrofit,在此基础上会延伸出一...
    涅槃1992阅读 7,848评论 13 133
  • 海鸥姑娘冲向海面 想要抓住那颗星星 然而爪子碰上瞬间 星星便碎了 一次又一次尝试后 她急的哭了出来 一颗星星在她的...
    鄭if阅读 486评论 0 0
  • 哭泣的小溪啊 它正悄悄地注视着你呢 你看它涓涓的细流 悄然躲开岸边的青石 礁石上生长多年的青苔 你看哪 它正悄悄地...
    小远姑娘阅读 302评论 1 6