一、Cookie应用场景举例一
android okhttp使用cookie请求_暴走邻家的博客-CSDN博客
今天,简单讲讲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存储在文件中或者数据库中即可。