OKHTTP:Cookie使用场景

一、Cookie应用场景举例一

android okhttp使用cookie请求_暴走邻家的博客-CSDN博客

使用Okhttp持久化Cookie - 代码先锋网

今天,简单讲讲Android的http使用cookie请求。

现在,做一个功能,出现一个奇怪现象,就是老是登陆成功后,发送请求获取消息,老是提示我没有登陆。我自己都不知道是什么原因,这个也是我对网络通信这块不了解。请教了其他大神后,终于知道是请求没有加cookie的问题。这里记录一下。

Request经常都要携带Cookie,上面说过request创建时可以通过header设置参数,Cookie也是参数之一。就像下面这样:

Request request = new Request.Builder()
    .url(url)
    .header("Cookie", "xxx")
    .build();

然后可以从返回的response里得到新的Cookie,你可能得想办法把Cookie保存起来。
但是OkHttp可以不用我们管理Cookie,自动携带,保存和更新Cookie。
方法是在创建OkHttpClient设置管理Cookie的CookieJar,只需要我们复写两个方法即可:

private final HashMap<String, List<Cookie>> cookieStore = new HashMap<>();
OkHttpClient okHttpClient = new OkHttpClient.Builder()
    .cookieJar(new CookieJar() {
        @Override
        public void saveFromResponse(HttpUrl httpUrl, List<Cookie> list) {
            cookieStore.put(httpUrl.host(), list);
        }
 
        @Override
        public List<Cookie> loadForRequest(HttpUrl httpUrl) {
            List<Cookie> cookies = cookieStore.get(httpUrl.host());
            return cookies != null ? cookies : new ArrayList<Cookie>();
        }
    })
    .build();

这样就可以解决cookie的问题了,很感谢写这篇文章的人。参考文章:okhttp3带cookie请求 - 安卓笔记侠 - 博客园

二、Cookie应用场景举例二

项目中都是需要登录再去获取对应的接口的数据,这里针对于登录后保持cookie然后访问剩余接口信息的功能实现:

            OkHttpClient httpClient = new OkHttpClient.Builder()
                        .cookieJar(new CookieJar() {

                            //自定义
                            private final HashMap<HttpUrl,List<Cookie>> cookieStore = new HashMap<HttpUrl, List<Cookie>>();

                            //复写
                            @Override
                            public void saveFromResponse(HttpUrl url, List<Cookie> cookies) {
                                cookieStore.put(url,cookies);
                            }

                            //复写
                            @Override
                            public List<Cookie> loadForRequest(HttpUrl url) {
                                List<Cookie> cookies = cookieStore.get(url);
                                return cookies != null ? cookies : new ArrayList<Cookie>();
                            }
                        }).build();

所谓的Cookie我们可以简单的理解为存储的为键值对:key = value,我们建立一个HashMap作为存储url为key,对应的url服务器返回给我们的cookie数组

一个cookie就是一对值,服务器可能返回给我们的多个cookie键值对,例如:

name = Tom 一个cookie

age = 13 另外一个cookie

saveFromResponse(HttpUrl url,List cookies),用来获取服务器端返回的Response中返回的Cookies(可能是很多个),存储在cookieStore这个变量中

loadForRequest(HttpUrl url),用来根据url这个key来从cookieStore中获取去对应的所有的Cookie

Cookie作为持久化的机制

首先,Cookie是存储在客户端也可认为是浏览器端,Session存储在服务器端,当我们登录淘宝后是不是就可以访问淘宝的所有的网站了,而不是访问一个页面就要登录一次吧,这里就是Session和Cookie在起作用


浏览器 - - - - - - > 服务器(服务器为用户创建一个Session)

浏览器 <- - - SessionID返回- - - 服务器(服务器在确认登录成功后
可以在session存储一些标示这个用户的唯一信息)

浏览器就SeesionId保存在了Cookie中,接着用户访问其他页面的时候,
服务器就知道该用户的Session是哪一个并从中取出标示信息和该用户的信息做比对,
匹配上了就说明这个回话存在即用户不需要登录就可以接着访问页面了

小结

从上面的代码逻辑来看的话,关键点在于获取登录成功后服务器返回的Cookie信息,并将Cookie信息作为访问其他页面的Cookie信息即可。

所以我们也可以自己去处理而不用使用new CookieJar()的形式,可以自己单独将登录成功后的Cookie信息单独拿出来保存。

当我们想要实现免密登录,我们只需要将Cookie存储在文件中或者数据库中即可。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值