cookie的持久化管理

okhttp自带一个cookie管理器

public static OkHttpClient getClient() {
        if (client == null) {
            synchronized (OkHttpClient.class) {
                if (client == null) {
                    HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
                    logging.setLevel(HttpLoggingInterceptor.Level.BODY);
                    client = new OkHttpClient.Builder()
                            .cookieJar(new CookieJar() {

                        private static HashMap<String, List<Cookie>> cookieStore = new HashMap<>();
                                @Override
                                public void saveFromResponse(HttpUrl url, List<Cookie> cookies) {
                                    cookieStore.put(url.host(), cookies);
                                    Log.i(TAG, "saveFromResponse: cookies="+cookies);
                                   
                                    }
                                }

                                @Override
                                public List<Cookie> loadForRequest(HttpUrl url) {
                                    List<Cookie> cookies = cookieStore.get(url.host());
                                    if (cookies != null) {
                                        LogUtil.i(TAG, "loadForRequest: cookies=" + cookies);
                                    }
                                    return cookies != null ? cookies : new ArrayList<>();

                                }
                            })
                            .addInterceptor(logging)
                            .readTimeout(10000, TimeUnit.MILLISECONDS)
                            .writeTimeout(10000, TimeUnit.MILLISECONDS)
                            .connectTimeout(10000, TimeUnit.MILLISECONDS)
                            .build();
                }
            }
        }
        return client;
    }

在saveFromResponse()方法,会更新存储新的cookie到cookieStore中

在loadForRequest()方法,每次加载网络请求,都会从map中读取cookie并添加

在okHttp3中,cookie是以List为单位使用,一般包括两个元素

在cookie中expiresat或者max_age标签会涉及到cookie的生命周期

cookie.setmaxage设置为0时,会马上在浏览器上删除指定的cookie

cookie.setmaxage设置为-1时,代表关闭当前浏览器即失效。

其他正数数值,代表生命周期(单位秒)

 

目前cookie,没有生命周期(max_age为0)

因此只要保证把获取到的cookie持久化保存,每次登陆的时候从本地读取cookie即可

同时为了性能考虑,同时维护一个cookieJar,只有当每次活动重启,通过新建cookieJar获取不到cookie时,从本地获取,并添加到cookiejar中

//这里是用来维护每次新建活动的cookieJar的cookieMap
private static HashMap<String, List<Cookie>> cookieStore = new HashMap<>();

new CookieJar() {

                                @Override
                                public void saveFromResponse(HttpUrl url, List<Cookie> cookies) {
                                    cookieStore.put(url.host(), cookies);
                                    Log.i(TAG, "saveFromResponse: cookies="+cookies);
//这里用到了litePal数据库来存储cookies,每次存储需要清空以前的历史cookies
                                    LitePal.deleteAll(MyCookie.class);
                                    for (Cookie data :
                                            cookies) {
//由于okhttp3.Cookie是final类,无法继承重写,因此,自己定义了一个JavaBean来保存cookie信息
                                        MyCookie myCookie=new MyCookie(data);
                                        myCookie.save();
                                    }
                                }

                                @Override
                                public List<Cookie> loadForRequest(HttpUrl url) {
                                    List<Cookie> cookies = cookieStore.get(url.host());
                                    if (cookies != null) {
                                        Log.i(TAG, "loadForRequest: cookies=" + cookies);
                                        return cookies;
                                    }else {
//当本地获取不到的时候,通过全局application的静态方法,来从数据库获取cookie,同时存入新建的cookieMap
                                        Log.i(TAG, "loadForRequest: cookies=null" );
                                        cookies=MyApplication.getCookie();
                                        cookieStore.put(url.host(),cookies);
                                        return cookies;
                                    }
                                }
                            }

 

MyApplication类

public static List<Cookie> getCookie(){
        List<Cookie> cookies=new ArrayList<>();
        List<MyCookie> myCookies = LitePal.findAll(MyCookie.class);
        if (myCookies.size()==0){
            return new ArrayList<>();
        }
        for (MyCookie data :
                myCookies) {
            cookies.add(data.getCookie());
        }
        return cookies;
    }

MyCookie类

public class MyCookie  extends LitePalSupport {

    private  String name;
    private  String value;
    private  long expiresAt;
    private  String domain;
    private  String path;
    private  boolean secure;
    private  boolean httpOnly;

    private  boolean persistent; // True if 'expires' or 'max-age' is present.
    private  boolean hostOnly; // True unless 'domain' is present.


    public MyCookie() {
    }

    public MyCookie(Cookie cookie) {
        this.name = cookie.name();
        this.value = cookie.value();
        this.expiresAt = cookie.expiresAt();
        this.domain = cookie.domain();
        this.path = cookie.path();
        this.secure = cookie.secure();
        this.httpOnly = cookie.httpOnly();
        this.persistent = cookie.persistent();
        this.hostOnly = cookie.hostOnly();
    }

    public Cookie getCookie(){
        Cookie.Builder builder=new Cookie.Builder();
        builder.name(name)
                .value(value)
                .expiresAt(expiresAt)
                .domain(domain)
                .path(path);
        if (secure){
            builder.secure();
        }
        if (httpOnly){
            builder.httpOnly();
        }
        if (hostOnly){
            builder.httpOnly();
        }
        return builder.build();
    }
}

http://www.open-open.com/lib/view/open1453422314105.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值