Java【HTTP】什么是 Cookie 和 Session? 如何理解这两种机制的区别和作用?

news/2024/5/18 15:27:37 标签: java, http, Cookie, Session, 会话
http://www.w3.org/2000/svg" style="display: none;">

文章目录


前言

各位读者好, 我是小陈, 这是我的个人主页, 希望我的专栏能够帮助到你:
📕 JavaSE基础: 基础语法, 类和对象, 封装继承多态, 接口, 综合小练习图书管理系统等
📗 Java数据结构: 顺序表, 链表, 堆, 二叉树, 二叉搜索树, 哈希表等
📘 JavaEE初阶: 多线程, 网络编程, TCP/IP协议, HTTP协议, Tomcat, Servlet, Linux, JVM等(正在持续更新)


提示:是正在努力进步的小菜鸟一只,如有大佬发现文章欠佳之处欢迎批评指点~ 废话不多说,直接上干货!

Cookie_19">一、Cookie

在 介绍HTTP协议的这篇文章中 已经介绍过了Cookie, 本篇再赘述一遍

Cookie_22">1, 什么是 Cookie

Cookie 是浏览器在本地存储用户自定义数据的一种关键机制

如下图所示, Cookie 里有很多键值对(数据可以由程序员自定义), 键值对之间用分号分割, 键和值之间用等号分割, 具体这些键值对表示的含义是什么, 咱不知道, 只有开发这个网站的程序员知道

https://img-blog.csdnimg.cn/018c74bdab18411ea61cf9204aaa87a1.png" alt="在这里插入图片描述" />
浏览器作为客户端, 需要向该网站的服务器发送请求来获取资源, 显然服务器是需要存储一些数据的, 而浏览器这边也需要存储一些数据, 比如说用户的登录信息

既然客户端这边要存储数据, 能否直接存在用户的硬盘上? 一定不可以, 不能允许网页操作本机的硬盘, 文件系统, 否则如果被恶意网站植入病毒, 硬盘中的数据都可能受到威胁, 所以浏览器是禁止网页访问硬盘的

Cookie 就是解决这一问题的重要机制, 浏览器允许网页把重要的信息存储在各自网页的 Cookie 中, 同一个网站(主页和子页)共享一份 Cookie


Cookie__37">2, Cookie 从哪里来

Cookie (中存储的数据)从服务器来: 第一次登陆一个网站的时候, 服务器会返回一个响应, 在这个响应报文中, 通过 Set-Cookie 把需要存储的值返回给客户端, 客户端进行存储

比如在我的 gitee 主页上可以查看已经存储的 Cookie, 方便观察我们把这些都删除

https://img-blog.csdnimg.cn/30e72bb88c284da4ba2778a9ec5a0039.png" alt="在这里插入图片描述" />
https://img-blog.csdnimg.cn/9a2eb6843ad24e57acc5ea8dcafcfa15.png" alt="在这里插入图片描述" />

删除 Cookie 之后, 其中存储的有关用户登录的信息就没了, 有些网站可能会主动退出登录, 或者自动重新登陆, 通过 fiddler 可以抓包看到登陆时的响应报文中确实有 Set-Cookie 字段

https://img-blog.csdnimg.cn/22d443b17849492b89e602b67bb0124a.png" alt="在这里插入图片描述" />

里面包含了一个 gitee-session-n 这样的属性, 属性值是一串很长的加密之后的信息. 这个信息就是用户当前登陆的身份标识. 也称为 “令牌(token)”

Cookie__55">3, Cookie 到哪里去

Cookie 要回到服务器, 当客户端收到 Set-Cookie 中的数据后, 后续每次请求网页的时候, 给服务器发送的请求报文中都有一个 Cookie 字段, 相当于把 Cookie 里面的值再带给服务器

https://img-blog.csdnimg.cn/25145366137b416bacd74972765be53f.png" alt="在这里插入图片描述" />

请求你中的 Cookie 字段也包含了一个 gitee-session-n 属性, 里面的值和刚才服务器返回的值相同, 后续只要访问 gitee 这个网站, 就会一直带着这个令牌, 直到令牌过期/下次重新登陆

Cookie__62">4, Cookie 有什么用

Cookie 是一浏览器客户端在本地存储用户自定义数据的一种机制, 比如存储用户的身份信息, 让服务器通过 Cookie 来识别用户身份


Session_68">二、Session

Session_70">1, 什么是 Session

Cookie 中可以存储着标识了用户身份的"令牌", 访问网站时, 客户端携带着当前用户的"身份令牌", Session (会话)就是服务器端用来记录令牌, 以及令牌对应着的该用户的详细身份信息

服务器如何存储用户的"身份令牌", 如何存储用户的身份信息, 存储什么样的身份信息, 都是使用 Session 做的, Session 通常Cookie 配合使用


Session_77">2, 理解 Session

服务器同一时刻收到的请求是很多的. 服务器需要清除的区分清楚每个请求是从属于哪个用户, 就需要在服务器这边记录每个用户令牌以及用户的信息的对应关系

会话的本质就是一个 “哈希表”, 存储了一些键值对结构. key 就是 token/sessionId, value 就是用户信息(用户信息可以根据需求灵活设计)

sessionId 是由服务器生成的一个 “唯一性字符串”, 从 session 机制的角度来看, 这个唯一性字符串称为 “sessionId”. 但是站在整个登录流程中看待, 也可以把这个唯一性字符串称为 “token”
sessionId 和 token 就可以理解成是同一个东西的不同叫法(不同视角的叫法).

https://img-blog.csdnimg.cn/01781d4143a94eb989398dd22778106d.jpeg#pic_center" alt="在这里插入图片描述" />


Cookie__Session__92">三、CookieSession 的区别

  • Cookie 是客户端的机制. Session 是服务器端的机制.
  • CookieSession 经常会在一起配合使用. 但是不是必须配合
    • Cookie 完全可以保存其他数据在客户端. 不一定是用户身份信息, 也不一定是token / sessionId

总结

以上就是本篇的所有内容了, Cookie 是客户端(浏览器)在本地存储数据的机制, Session 是服务器用来存储用户身份信息的机制

如果本篇对你有帮助,请点赞收藏支持一下,小手一抖就是对作者莫大的鼓励啦😋😋😋~


上山总比下山辛苦
下篇文章见

https://img-blog.csdnimg.cn/f039cf0dd42b4b96a762a785d4378bce.gif#pic_center" alt="在这里插入图片描述" />


http://www.niftyadmin.cn/n/4958973.html

相关文章

Arduino平台ESP8266数据flash存储模式使用介绍

Arduino平台ESP8266数据flash存储模式使用介绍 📌参考说明文档:https://arduino-esp8266.readthedocs.io/en/latest/PROGMEM.html PROGMEM关键字,原基于AVR单片机使用的,为了节省RAM空间,将字符串放入闪存中&#xff0…

《vue3实战》在created生命周期中运用slice()方法结合element plus组件实现电影评价系统的分页

目录 前言 电影评价系统的分页是什么?它具体的作用体现在哪些方面? 一、slice的含义、语法和作用以及created的作用 slice是什么?slice有什么语法?slice的作用体现在哪些方面? created生命周期的作用:…

【python】【多线程】python多线程只用了一个CPU

python的多线程不能利用多核CPU python的多线程写入内存速度为 2GB/s,和单线程一样python的多进程写入内存速度为 7GB/s 为啥相差这么大呢? GIL: (1)在python中有一个GIL(Global Interpreter Lock&#xf…

第19集丨Vue 江湖 —— ref属性

目录 一、多个单闭合组件标签二、ref属性三、小技巧 一、多个单闭合组件标签 下面案例中&#xff0c;多个单闭合标签<School/> &#xff0c;如果在非脚手架环境下只会显示第一个&#xff0c;但是在脚手架环境中&#xff0c;都会显示出来。 <template><div id&q…

ISVE2023展商 | 皮克智能:零售及互联网领域数字化变革开拓者

ISVE2023展商 | 皮克智能&#xff1a;零售及互联网领域数字化变革开拓者 01 公司介绍 Exhibitor Profile 皮克智能是优质的智能硬件产品及系统解决方案提供商&#xff0c;具备自主研发创新、软硬件方案集成及全产业链资源整合的能力。 公司总部位于中国深圳&#xff0c;主要服…

关于intern()的面试难题

1、在jdk6中的运行结果 package string;public class StringIntern {public static void main(String[] args) {String s new String("1");s.intern();String s2 "1";System.out.println(s s2);//jdk6: falseString s3 new String("1") ne…

套接字属性设置

基本概念 设置套接字的选项对套接字进行控制除了设置选项外&#xff0c;还可以获取选项选项的概念相当于属性&#xff0c;所以套接字选项也可说是套接字属性有些选项&#xff08;属性&#xff09;只可获取&#xff0c;不可设置有些选项既可设置也可获取 选项级别 SOL_SOCKET的…

BC77 有序序列插入一个数

描述 有一个有序数字序列&#xff0c;从小到大排序&#xff0c;将一个新输入的数插入到序列中&#xff0c;保证插入新数后&#xff0c;序列仍然是升序。 输入描述 第一行输入一个整数(0≤N≤50)。 第二行输入N个升序排列的整数&#xff0c;输入用空格分隔的N个整数。 第三…