![3f603f2efd89dd6addfa120bef5d39c6.png](https://i-blog.csdnimg.cn/blog_migrate/b88dbfe77eb24b2cf6c89a9c72ef986a.jpeg)
前言
虽然在学习服务器端语言的时候屡屡提到了Cookie和session这两个概念,有关Cookie和Session的接口也调用过,但始终对实现交互机制和这两者区别的理解感觉是云里雾里,于是打算静下心来,尝试用这一篇文章去搞懂Cookie和session。本文旨在理清Cookie和session的交互机制并无涉及具体后台语言的实现。
Cookie
简介
我们先来看看MDN上面是怎么说的:
HTTP Cookie(也叫Web Cookie或浏览器Cookie)是服务器发送到用户浏览器并保存在本地的一小块数据,它会在浏览器下次向同一服务器再发起请求时被携带并发送到服务器上。通常,它用于告知服务端两个请求是否来自同一浏览器,如保持用户的登录状态。Cookie使基于无状态的HTTP协议记录稳定的状态信息成为了可能。
通过上面的定义我们可以了解:
- Cookie是HTTP协议里面请求头的组成部分,它是一种客观存在的文本数据,并且体积很小。
- Cookie存在于客户端里面,所以它是可以被我们浏览器(客户机)给清除掉的。
- HTTP是无状态的(准确来说应该是HTTP1.0)。HTTP的无状态使其不能记住用户的状态。那什么是无状态呢?就是说这一次请求和上一次请求是没有任何关系的,互不认识的,没有关联的。例如:他是未登录还是已登录?这都无从得知。
(清除缓存的时候就可以看到清除cookie的选项)
![3daba26ee5d6620516b8c8d652c19485.png](https://i-blog.csdnimg.cn/blog_migrate/c3454ef0868b3a803c27ece2e130e213.jpeg)
一个没有Cookie的世界
那假如我们以添加购物车的例子来说明:一个没有Cookie的世界是怎么样的?
以下模拟一下场景,C代表用户,S代表服务器
C:输入用户名和密码,跳转到主页
C:点击添加购物车
B:不好意思,你是谁阿?这个添加购物车的按钮,需要获得登录权限之后才能使用
C:于是很憋屈地再次输入用户名和密码,打算再点击添加购物车的按钮
B:不好意思,你是谁阿?这个添加购物车的按钮,需要获得登录权限之后才能使用
C:.......
这个案例里面反映了客户机和服务器的交互过程,因为登录本身只是调用了“登录”接口本身,确认了用户名和密码本身是正确的,而没有将该用户已经登录的“状态”记住。而Cookie的作用,就是在该用户登录成功之后,将登录状态“种”在客户机,下次以HTTP请求的方式带过来。那么,该用户之后的操作都可以基于“已经登录成功”的状态上进行。
cookie工作原理
客户端浏览器会把Cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态。
![e1aebdd334b06d850684692347bafd6b.png](https://i-blog.csdnimg.cn/blog_migrate/91687bb94987a744b7936ef3304553eb.jpeg)
session
概念
在计算机中,尤其是在网络应用中,称为“会话控制”。Session 对象存储特定用户会话所需的属性及配置信息。这样,当用户在应用程序的 Web 页之间跳转时,存储在 Session 对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。当用户请求来自应用程序的 Web 页时,如果该用户还没有会话,则 Web 服务器将自动创建一个 Session 对象。当会话过期或被放弃后,服务器将终止该会话。
以上是百度百科的解释,下面是自己阅读过很多文档之后对于session的理解:
开发者为了表示客户机和服务器之间一对一的交互,抽象为“会话”。本质上是创建特定用户和服务器之间交互的唯一标识,让服务器“认得清”一系列操作是否出自同一个用户。和Cookie不同的是,它更像是一种连接用户和服务器之间抽象的“解决方案”。而Cookie是一种可见的请求头带过去服务器的文本数据。但经常在提及Cookie的时候经常会顺带上session,是因为session的实现经常借助Cookie,给Cookie上创建一个sessionId的方式,构建用户和服务器之间的联系。所以,session这种“会话管理”的场景是Cookie技术的具体实现之一。 记住,session的目的是为了标识用户,跟踪用户的状态。
Session工作原理
Session是另一种记录客户状态的机制,保存在服务器上。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上。
![711ad27cb07f1597795fea8bf1750da2.png](https://i-blog.csdnimg.cn/blog_migrate/009da6b557a280ed589f63dd4792acac.jpeg)
session的实现方式
1、借助Cookie的sessionId发送的方式
2、通过LocalStorage的方式
3、URL回写的方式,这是客户端禁止接收Cookie之后的方法。
格式:http://../xx;Sessionid=ByOK3vjFD75aPnr....
或者:http://../xx?Sessionid=ByOK3vjFD75aPnr....(通过查询字符串的方式)
4、隐藏表单字段(hidden)
Session的有效期
1.Session超时失效
可以在web容器中设置,以Tomcat举例,
<session-config>
tomcat默认session超时时间为30分钟,可以根据需要修改,负数或0为不限制session失效时间
这里要注意这个session设置的时间是根据服务器来计算的,而不是客户端。所以如果在调试程序,应该是修改服务器端时间来测试,而不是客户端
2.程序调用HttpSession.invalidate()
3.服务器进程被中止
Cookie和session的联系与区别
1.Cookie存在客户端,而session存在服务器端。
而两张图来描述一下差别,
![e92e52fd00c06a55192d6fce9ce7e66a.png](https://i-blog.csdnimg.cn/blog_migrate/d5ee38a121c1faa7423d0d09427fbe3d.jpeg)
![97e6fd73f475e5fae03549cbbecebd54.png](https://i-blog.csdnimg.cn/blog_migrate/523bb1c05efcffc9b24f71d6efd2fa98.jpeg)
上面两张图的区别在于,前者是直接以 [{user:xavier},{gender:man}]的格式放在客户端cookie上的,而后者是用[{"JsessionId:xxxx"}]的格式放在客户端cookie,然后在再次访问的时候运用读取JessionId的值即(xxxx)的方式在服务器域对象里面找到对应的数据,既 [{user:xavier},{gender:man}]。
2.Cookie的体积比较小,不能大于4KB。这当然是废话,Cookie依赖于HTTP请求头,肯定不能太大。session的大小取决于服务器的大小(一般来讲会比较大)。
3.session的sessionId执行依赖于Cookie,但不仅仅是Cookie,还可以是LocalStorage或者URL回写传递给服务器。
4.session可以放在文件,数据库,甚至是内存。当然放在内存不太好,原因在于已重启服务器的话,会话状态就不见了。
5.Cookie相对不安全,因为用户可以直接使用document.cookie 这套API来修改Cookie,而session是放在服务器,所以用户不能直接拿到,因此相对安全。
更多具体有关的Cookie可以参考阮一峰的基础教程:
Cookiewangdoc.com