网站首页 > 教程分享 正文
1.什么是cookie?
Cookie 技术产生源于 HTTP 协议在互联网上的急速发展。随着互联网时代的策马奔腾,带宽等限制不存在了,人们需要更复杂的互联网交互活动,就必须同服务器保持活动状态(简称:保活)。
Cookie 是在 HTTP 协议下,服务器或脚本可以维护客户工作站上信息的一种方式。Cookie 是由 Web 服务器保存在用户浏览器(客户端)上的小文本文件,它可以包含有关用户的信息。无论何时用户链接到服务器,Web 站点都可以访问 Cookie 信息.
2.cookie的起源
Cookie最早是网景公司的前雇员Lou Montulli在1993年3月的发明。
3.Cookie时效性
Cookie的默认时效为Session,也就是说浏览器关闭,Cookie会和session一起失效,但是Cookie的有效时间是可以设置的。
Cookie有一个属性expires,设置其值为一个时间,那么当到达此时间后,此cookie失效。
实现如下:
4.Cookie文件的删除、销毁
由于 Cookie 在用户的计算机中,所以无法直接将其直接移除。所以我们用浏览器来删除 Cookie。首先是创建一个与要删除的 Cookie 同名的新 Cookie,将该 Cookie 的到期日期设置为早于当前日期的某个日期,当浏览器检查 Cookie 的到期日期时,浏览器便会丢弃这个现已过期的 Cookie。
5.Cookie使用限制
Cookie是HTTP头中的一个字段,虽然HTTP本身对这个字段并没有多少限制,但是Cookie最终还是存储在浏览器里,所以不同的浏览器对Cookie的存储都有一些限制,不同的浏览器对 Cookie 的处理不一致,使用时一定要考虑。
客户端用户如果设置禁止 Cookie,则 Cookie 不能建立。 并且在客户端,一个浏览器能创建的 Cookie 数量根据浏览器的不同,其上限也不同。
6.执行流程:
1)、首先,客户端会发送一个http请求到服务器端。
2)、服务器端接受客户端请求后,发送一个http响应到客户端,这个响应头,其中就包含Set-Cookie头部,浏览器保存Cookie。
3)、浏览器第二次访问,将保存的cookie发给后台,后台识别并更新cookie,返回浏览器再次保存。
为了方便理解,可以先看下这张流程执行图加深概念
那么,在浏览器上面的请求头和Cookie在那?下图给大家截取了其中一种。
上面我们都是在谈浏览器上的Cookie,那么在Android开发中,我们该如何去管理和使用Cookie?
7.Okhttp框架(本文是基于Okhttp3.0版本以上)
Okhttp是一款相当经典的网络框架,它的API可以通过OkhttpClient中的CookieJar或者拦截器去管理Cookie的。
我们在构建单例OkhttpClient的时候,设置cookiejar或者拦截器,然后具体的操作(保存Cookie,取Cookie),Okhttp框架就会帮我们自动管理Cookie。
如下图:
这是其中一种通过集合的增查特性,就可以简单有效的帮我们管理Cookie。但我们还是要通过源代码去一探究竟。首先,CookieJar是一个接口。
英文注释翻译过来就是:
CookieJar这个接口为HTTP cookies提供了强大的支持和相关策略。
这种策略的实现作用会负责选择接受和拒绝那些cookie。一个合理的策略是拒绝所有的cookie,尽管这样会干扰需要cookie的基于会话的自身身份验证方案。
作为Cookie的持久性,该接口的实现也必须要提供Cookie的存储。一种简单的实现可以将cookie存储在内存中;复杂的系统可以使用文件系统用于保存已接受的cookie的数据库。
所以,Okhttp的源码告知我们可以将cookie存储在内存中;复杂的系统可以使用文件系统用于保存已接受的cookie的数据库。因此,我们就可以通过Map去简单的管理和使用。
继续分析CookieJar接口里面的方法,依旧上源码里面有方法一个是saveFromResponse(HttpUrl url, List cookies)、loadForRequest(HttpUrl url)
saveFromResponse方法注释:根据这个jar的方法,可以将cookie从一个HTTP响应保存到这里。如果有响应,此方法可能会引起第二次HTTP响应,包括一个追踪。对于这个隐蔽的HTTP特性,这里的cookie只包含其追踪的cookie。简单点理解就是如果我们使用了这个方法,就会进行追踪(也就是说客户端请求成功以后,在响应头里面存cookie)
loadForRequest方法注释:将cookie从这个方法加载到一个HTTP请求到指定的url。但是这个方法从网络上返回的结果可能是一个空集合。简单的实现将返回的尚未过期的并且已接受的cookie去进行匹配。(也就是加载url的时候在请求头带上cookie)。
这样,我们通过以上代码就可以完成了Cookie的非持久化。
那么这个非持久化又是什么呢?
前面我们说了,Cookie是具有时效性的,所以,Cookie的管理又分为持久化Cookie和非持久化Cookie。
非持久化Cookie存储在内存中,也就意味着,其生命周期基本和App保持一致,App关闭后,Cookie丢失,一般我们也不使用这种方式。
持久化Cookie则是存储在本地磁盘中,App关闭后不丢失。
那么,如果我们要使用Cookie的持久化策略,大体上可以参照上面的非持久化策略,只是需要将存储方式改一下即可:
1).通过响应拦截器从response取出cookie并保存到本地,通过请求拦截器从本地取出cookie并添加到请求中
2).自定义CookieJar,在saveFromResponse方法中保存cookie到本地,在loadForRequest方法从本地取出cookie。
那么在这里主要介绍如何通过Okhttp的拦截器去进行持久化cookie操作。
1).保存cookie拦截器
2).保存cookie拦截器
这个SaveCookiesInterceptor拦截器的实现,是首先从response获取set-cookie字段的值,然后通过SharedPreferences保存在本地。
将Cookie添加到请求头:
AddCookiesInterceptor请求拦截器,这个拦截的作用就是判断如果该请求存在cookie,则为其添加到Header的Cookie中。
写好这两个拦截器之后,我们只需要将实例对象放进OkhttpClient里面即可快速的完成Cookie持久化操作。(这两个拦截器在同步Cookie的时候也很好用)
Okhttp使用cookie拦截器
猜你喜欢
- 2024-10-20 java 实现利用 RabbitMQ 发送和消费消息
- 2024-10-20 手把手讲解-OkHttp硬核知识点(2)(okhttp原理详解)
- 2024-10-20 XXL-JOB核心源码解读及时间轮原理剖析
- 2024-10-20 高并发场景下的 HttpClient 优化方案,QPS 大大提升!
- 2024-10-20 原来java结合docker这么简单!快来看看命令大全以及java结合使用
- 2024-10-20 Flink 实时计算 - 用户如何使用自定义 Jar 包
- 2024-10-20 分库分表实现方式Client和Proxy,性能和维护性该怎么选?
- 2024-10-20 K8S官方java客户端之三:外部应用(k8s官方java客户端之三:外部应用手册)
- 2024-10-20 在用httpclient发送post报文请求错误解决
- 2024-10-20 基于zabbix4.0监控tomcat服务及JVM内存
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- css导航条 (66)
- sqlinsert (63)
- js提交表单 (60)
- param (62)
- parentelement (65)
- jquery分享 (62)
- check约束 (64)
- curl_init (68)
- sql if语句 (69)
- import (66)
- chmod文件夹 (71)
- clearinterval (71)
- pythonrange (62)
- 数组长度 (61)
- javafx (59)
- 全局消息钩子 (64)
- sort排序 (62)
- jdbc (69)
- php网页源码 (59)
- assert h (69)
- httpclientjar (60)
- postgresql conf (59)
- winform开发 (59)
- mysql数字类型 (71)
- drawimage (61)
本文暂时没有评论,来添加一个吧(●'◡'●)