文章目录
- 前言
- 1. 回顾 Cookie
- 1.1 到底什么是 Cookie
- Cookie 的数据从哪里来
- Cookie 的数据长什么样
- Cookie 有什么作用
- Cookie 到哪里去
- Cookie 怎么存储的
- 2. 理解 Session
- 3. Cookie 和 Session 的区别
- 总结
前言
在讲 HTTP 协议时, 我们就谈到了 Cookie 和 Session, 当时我们只是粗略一提, 并简单举了个登录流程的例子来说明他们. 本文我们继续再来聊聊.
关注收藏, 开始学习吧🧐
1. 回顾 Cookie
HTTP 协议自身是属于 “无状态” 协议.
“无状态” 的含义指的是: 默认情况下 HTTP 协议的客户端和服务器之间的这次通信, 和下次通信之间没有直接的联系.
但是实际开发中, 我们很多时候是需要知道请求之间的关联关系的.
例如登陆网站成功后, 第二次访问的时候服务器就能知道该请求是否是已经登陆过了.
1.1 到底什么是 Cookie
Cookie 是浏览器在本地持久化存储数据的一种机制.
Cookie 的数据从哪里来
是服务器返回给浏览器的.
Cookie 的数据长什么样
是键值对结构的数据, 并且这里的键值都是程序员自己定义的.
Cookie 有什么作用
可以在浏览器这边存储一些 “临时性的数据”, 其中最典型的一种使用方式, 就是用来存储 “身份标识”. (涉及到 Cookie 和 Session 之间的联动, 我们下面讲)
Cookie 到哪里去
会在下次访问该网站的时候, 自动的被带到 HTTP 请求中去. (直到 Cookie 过期)
Cookie 怎么存储的
浏览器根据不同的 “域名” 分别存储 Cookie, 不同域名之间的 Cookie 互不干扰. 一般都是存储在当前设备的硬盘上, 如果更换设备, Cookie 就会丢失. 即使不更换设备, Cookie 也会过期(会有一个超时时间).
浏览器上的一个登录流程
图中的 “令牌” 通常就存储在 Cookie 字段中.
回忆之前的例子:
- 到了医院先挂号. 挂号时候需要提供身份证, 同时得到了一张 “就诊卡”, 这个就诊卡就相当于患者的 “令牌”.
- 后续去各个科室进行检查, 诊断, 开药等操作, 都不必再出示身份证了, 只要凭就诊卡即可识别出当前患者的身份.
- 看完病了之后, 不想要就诊卡了, 就可以注销这个卡. 此时患者的身份和就诊卡的关联就销毁了. (类似于网站的注销操作)
- 又来看病, 可以办一张新的就诊卡, 此时就得到了一个新的 “令牌”
此时在服务器这边就需要记录令牌信息, 以及令牌对应的用户信息, 这个就是 Session 机制所做的工作.
2. 理解 Session
服务器同一时刻收到的请求是很多的. 服务器需要清除的区分清楚每个请求是从属于哪个用户, 就需要在服务器这边记录每个用户令牌以及用户的信息的对应关系.
在去医院看病中, 就诊卡就是一张 “令牌”. 要想让这个令牌能够生效, 就需要医院这边通过系统记录每个就诊卡和患者信息之间的关联关系.
会话的本质就是一个 “哈希表”, 存储了一些键值对结构. key 就是令牌的 ID(token/sessionId), value 就是用户信息(用户信息可以根据需求灵活设计).
sessionId 是由服务器生成的一个 “唯一性字符串”, 从 session 机制的角度来看, 这个唯一性字符串称为 “sessionId”. 但是站在整个登录流程中看待, 也可以把这个唯一性字符串称为 “token”.
sessionId 和 token 就可以理解成是同一个东西的不同叫法(不同视角的叫法).
- 当用户登陆的时候, 服务器在 Session 中新增一个新记录, 并把 sessionId / token 返回给客户端. (例如通过 HTTP 响应中的 Set-Cookie 字段返回).
- 客户端后续再给服务器发送请求的时候, 需要在请求中带上 sessionId/ token. (例如通过 HTTP 请求中的 Cookie 字段带上).
- 服务器收到请求之后, 根据请求中的 sessionId / token 在 Session 信息中获取到对应的用户信息, 再进行后续操作.
Servlet 的 Session 默认是保存在内存中的. 如果重启服务器则 Session 数据就会丢失.
3. Cookie 和 Session 的区别
- Cookie 是客户端的机制. Session 是服务器端的机制.
- Cookie 和 Session 经常会在一起配合使用. 但是不是必须配合.
- 完全可以用 Cookie 来保存一些数据在客户端. 这些数据不一定是用户身份信息, 也不一定是token / sessionId
- Session 中的 token / sessionId 也不需要非得通过 Cookie / Set-Cookie 传递.
总结
✨ 本文主要讲了 Cookie 和 Session 相关知识.
✨ 想了解更多计算机网络的知识, 可以收藏一下本人的计算机网络学习专栏, 里面会持续更新本人的学习记录, 跟随我一起不断学习.
✨ 感谢你们的耐心阅读, 博主本人也是一名学生, 也还有需要很多学习的东西. 写这篇文章是以本人所学内容为基础, 日后也会不断更新自己的学习记录, 我们一起努力进步, 变得优秀, 小小菜鸟, 也能有大大梦想, 关注我, 一起学习.
再次感谢你们的阅读, 你们的鼓励是我创作的最大动力!!!!!