程序员的知识教程库

网站首页 > 教程分享 正文

彻底了解cookie——Java(java往cookie中存取数据)

henian88 2024-10-20 05:51:28 教程分享 159 ℃ 0 评论


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拦截器

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表