美文网首页Android专题freeCode@IT
Android利用Okhttp3实现Cookie持久化

Android利用Okhttp3实现Cookie持久化

作者: itfitness | 来源:发表于2019-03-22 09:26 被阅读122次

目录

目录

前言

有时候我们请求服务器需要对Cookie进行存储以此来判断身份,对于浏览器来说它会自己存储Cookie,但是对于手机App应用来说就需要相应的处理才能实现Cookie的持久化了。

Retrofit2.0获取响应头信息

这是我服务器端的代码,主要就是添加两个Cookie,lml和itfitness,然后返回的数据是一个固定的json数据:{"code":0,"data":{"luckNum":3},"msg":"成功"}。



请求数据的接口如下:

public interface Api {
    @GET("cookietest2")
    Observable<Response<ResultBean>> cookieTest();
}

这里我们将返回的对象设置为Response,因为可以通过Response对象获取到响应头信息,其中Response的泛型则是我们那段固定的json数据用GsonFormat转换的对象,而Cookie信息的获取就是在请求结束的时候。

RetrofitUtils.getInstance(this).getApiServier(Api.class)
                .cookieTest()
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Consumer<Response<ResultBean>>() {
                    @Override
                    public void accept(Response<ResultBean> responseBodyResponse) throws Exception {
                        Headers headers = responseBodyResponse.headers();//我们通过Response的headers对象获取到响应头信息。
                        List<String> values = headers.values("Set-Cookie");//通过“Set-Cookie”字段获取到服务器返回的Cookie信息
                        for(String s:values){
                            Log.e("测试-请求头",s);
                        }
                        Log.e("测试-请求体", responseBodyResponse.body().getMsg());//这里responseBodyResponse.body()获取的就是ResultBean对象
                    }
                }, new Consumer<Throwable>() {
                    @Override
                    public void accept(Throwable throwable) throws Exception {
                        Log.e("错误",throwable.getMessage());
                    }
                });

我们请求后Logcat打印的结果如下:



可以看到我们已经成功的获取了Cookie信息了,接下来就需要我们将Cookie信息保存下来,在以后的请求添加请求头信息了,然后在响应信息里更新Cookie信息,但是光是听就觉得这种方法麻烦了,不过还好Okhttp3给我们封装好了,接下来我们就看看Okhttp3如何实现Cookie持久化。

Okhttp3Cookie持久化

Okhttp3实现Cookie持久化很简单,首先我们需要在app gradle中引入如下依赖库:

implementation 'com.github.franmontiel:PersistentCookieJar:v1.0.1'

然后在Project的build文件下加入如下代码:

buildscript {
    
    repositories {
        google()
        jcenter()
        maven { url "https://jitpack.io" }//这个需要加入
    }
    ...
}

allprojects {
    repositories {
        google()
        jcenter()
        maven { url "https://jitpack.io" }//这个需要加入
    }
}

最后我们需要对OkHttpClient进行配置:

OkHttpClient.Builder builder = new OkHttpClient.Builder();
PersistentCookieJar cookieJar = new PersistentCookieJar(new SetCookieCache(), new SharedPrefsCookiePersistor(context.getApplicationContext()));
builder.cookieJar(cookieJar);//这是关键
OkHttpClient client = builder.build();

Retrofit mRetrofit = new Retrofit.Builder()
                .baseUrl(BASE_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .client(client)
                .build();

这样就将Cookie进行持久化了,而我们查看存储的Cookie的方法则是:

SharedPrefsCookiePersistor sharedPrefsCookiePersistor = new SharedPrefsCookiePersistor(MainActivity.this);
List<Cookie> cookies = sharedPrefsCookiePersistor.loadAll();

Activity代码:

public class MainActivity extends AppCompatActivity {
    private Button requestBt, logBt;
    private SharedPrefsCookiePersistor sharedPrefsCookiePersistor;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        sharedPrefsCookiePersistor = new SharedPrefsCookiePersistor(this);
        setContentView(R.layout.activity_main);
        requestBt = (Button) findViewById(R.id.bt);
        logBt = (Button) findViewById(R.id.bt3);
        requestBt.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                MainActivity.this.onClick(v);
            }
        });
        logBt.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                sharedPrefsCookiePersistor = new SharedPrefsCookiePersistor(MainActivity.this);
                List<Cookie> cookies = sharedPrefsCookiePersistor.loadAll();
                for (Cookie cookie:cookies){
                    Log.e("所有的Cookie:",cookie.name()+":"+cookie.value());
                }
            }
        });
    }
    public void onClick(View view){
        RetrofitUtils.getInstance(this).getApiServier(Api.class)
                .cookieTest()
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Consumer<ResultBean>() {
                    @Override
                    public void accept(ResultBean resultBean) throws Exception {

                    }
                }, new Consumer<Throwable>() {
                    @Override
                    public void accept(Throwable throwable) throws Exception {
                        Log.e("错误",throwable.getMessage());
                    }
                });

    }
}

界面上放了两个按钮一个是请求的一个是打印Cookie的:



另外我们在服务器代码中加入了打印Request请求头中的Cookie信息:



当我们点击发送请求然后点击打印Cookie按钮的时候Logcat信息如下:

当我们再次点击发送请求的时候服务器的信息如下:



这说明Cookie已经被我们给持久化了

相关文章

网友评论

    本文标题:Android利用Okhttp3实现Cookie持久化

    本文链接:https://www.haomeiwen.com/subject/ccnkvqtx.html