Session与Cookie的区别(三)
中场休息
让我们先从比喻回到网络世界里,HTTP 是无状态的,所以每一个 Request 都是不相关的,就像是对小明来说每一位客人都是新的客人一样,他根本不知道谁是谁。
既然你没办法把他们关联,就代表状态这件事情也不存在。
把左边换成顾客,右边换成小明也依然成立。多一个得是我多打了,但我懒得修。
那怎么办呢?在故事里我们用纸条来解决这件事情,小明会在结账时写下纸条并递给客人,客人下次只要再带着纸条过来,小明就知道发生什么事了。
小纸条功不可没
小明最大的问题就是他自己没办法记忆「状态」,因此需要倚靠一个机制来帮他管理「状态」,而这个机制我们就叫做 Session。
原本对小明来说,每一个客人都是新的客人,彼此之间毫无关联,所以也没有任何状态可言。
但有了纸条以后,两个在小明眼中完全不同的客人被关联了起来,小明就可以知道:「原来这个新的客人是以前那个来买木材的客人!」
所以 Session 是什么?就是一种让 Request 变成 Stateful 的机制。以小明的例子来说,Session 就是一种让客人之间能互相关联起来的机制。
小明靠纸条来实作 Session 机制,那在网络世界中可以靠什么呢?举一个最简单的例子,网址!
让我们假设有个购物网站的网址是:market.tw,当你把苹果加入购物车的时候,你其实是送一个 Request 给服务器,然后服务器会把你导到 market.tw?
item1=apple,接着你再把火山硅肺病加入购物车,网址就会变成:market.tw?item1=apple&item2=pneumonoultramicroscopicsilicovolcanoconiosis
最后你按下结账,服务器就靠着你地址栏上的信息来判断你的状态是什么,在这个例子中就等同于看你的购物车里面有什么。
简单来说呢,地址栏上的信息就是小明故事中的纸条,是储存状态的地方。而上述例子 Client 与 Server 透过地址栏上的状态来实作 Session 机制。
好,中场休息差不多到这边要结束了。这一段是想先拉回网络的部分,从原本故事中的比喻切回真实世界网络的运作模式,以及先让大家理解 Session 到底是个什么东西。
在接下来的故事里面,小明会碰到更多更多的问题,他能迎刃而解吗?让我们继续看下去。
到底谁会随身携带纸条?
前面已经有提过了,尽管小明靠着这个纸条的机制留住了一些常客,但是新客人呢?有多少人会愿意为了再来这间店而特地留下具有状态的纸条?
基本上没有,因为这样子太麻烦了!
有天小明在快要入眠时,忽有一庞然大物拔山倒树而来,盖一灵感也。他想到了一个绝妙的 idea:「不会有人随身携带纸条,但总会随身携带手机吧!」
于是流程就变成这样子:
-
客人来店里消费,小明结账时请他拿出手机,并在手机里面留了一些信息
-
客人第二次来店里,小明看看手机里有没有之前自己留下的信息
先不用管到底小明把信息放在手机的哪里,这不是重点;重点是手机里的信息取代了以前的纸条,客人不用刻意再带一个没有用的纸条了,只需要把本来就会随身携带的手机拿出来就好,跟以前相比方便许多。
好,接下来我们终于要讲到标题的第二个东西了:Cookie。Cookie 是什么?Cookie 就是故事里面存在手机的信息。
想要知道真正使用 Cookie 的流程,你只要把上面的客人用「浏览器」来取代,小明用「服务器」来取代,就是答案了:
-
浏览器发送一个 Request 给 Server,Server 叫浏览器设置 Cookie,浏览器便把这些数据存在 Cookie 里面。
-
浏览器带着 Cookie 一起发 Request 给 Server,Server 根据 Cookie 的内容决定状态。
这次没有买火山硅肺病了
虽然在现实生活中不是每个人都会随身携带手机,但是每个浏览器都会把 Cookie 一并带上去,也会按照 Server 的指令来储存 Cookie。
你可以把 Cookie 称作是一个机制,Server 可以利用 Set-Cookie 这个语法让浏览器储存一些内容,而这些内容会在浏览器发送 Request 时一并送上来。
而浏览器里储存的那些内容也叫做 Cookie,就是我们故事中所提的小纸条或者是存在手机里的信息。
前面有提过 Session 机制可以只靠地址栏操作,跟 Cookie 可以一点关系都没有。
但在实际应用上,Session 之所以常常跟 Cookie 绑在一起,就是因为靠 Cookie 来操作 Session 机制的话非常方便。
或者应该这样说,Cookie 本来就是为了操作 Session 而生的。藉由标准化的规范,制定了一个专门用来让浏览器与 Server 交换数据的机制。
如果用故事来比喻,就好比政府制定说每个人随身一定要携带手机,然后手机里面一定要存小明留下来的状态。
这边再来做个简单的总结:
Session 是什么?就是一种让 Request 变成 Stateful 的机制。以小明的例子来说,Session 就是一种让客人之间能互相关联起来的机制。在故事里面我们用了纸条跟手机里的信息来比喻,有多种方式可以达成 Session。
在网络世界中,也有很多种方式可以来操作 Session,前面介绍过第一种是地址栏,第二种就是靠 Cookie。而 Cookie 就是存在浏览器里的一些信息。
讲到这边,差不多就把 Session 与 Cookie 的定义与介绍讲完了,但故事还没完呢,我们还有最后一个问题要来解决。
相关文章:

Session与Cookie的区别(三)
中场休息 让我们先从比喻回到网络世界里,HTTP 是无状态的,所以每一个 Request 都是不相关的,就像是对小明来说每一位客人都是新的客人一样,他根本不知道谁是谁。 既然你没办法把他们关联,就代表状态这件事情也不存在。…...

七大设计原则之接口隔离原则应用
目录1 接口隔离原则介绍2 接口隔离原则应用1 接口隔离原则介绍 接口隔离原则(Interface Segregation Principle, ISP)是指用多个专门的接口,而不使用单一的总接口,客户端不应该依赖它不需要的接口。这个原则指导我们在设计接口时…...

【Shell1】shell语法,ssh/build/scp/upgrade,环境变量,自动升级bmc
文章目录1.shell语法:shell是用C语言编写的程序,是用户使用Linux的桥梁,硬件>内核(os)>shell>文件系统1.1 变量:readonly定义只读变量,unset删除变量1.2 函数:shell脚本传递的参数中包含空格&…...
JavaScript HTML DOM - 改变CSS
JavaScript 是一种动态语言,它可以动态地修改网页的外观,并且使用HTML DOM(文档对象模型)可以更方便地控制HTML元素的样式。 JavaScript 通过在HTML DOM中更改CSS属性来更改样式,这些CSS属性包括颜色、位置、字体大小…...

mycat连接mysql 简单配置
mycat三个配置文件位于conf下 可通过Notepad操作 首先配置service.xml中的user标签,设置用户名,密码,查询权限,是否只读等 只是设置了root用户,有所有权限 配置schema.xml <?xml version"1.0"?&g…...
Spring常用注解
文章目录一、Bean交给Spring管理1、Component2、Bean3、Controller4、Service5、Repository6、Configuration7、ComponentScan二、作用域1、Lazy(false)Scope三、依赖注入1、Autowired2、Resource3、Qualifier四、读取配置文件值1、Value一、Bean交给Spring管理 1、Component …...

I.MX6ULL内核开发9:kobject-驱动的基石
目录 一、摘要 二、重点 三、驱动结构模型 四、关键函数分析 kobject_create_and_add()函数 kobject_create()函数 kobject_init()函数 kobject_init_internal()函数 kobject_add()函数 kobject_add_varg&am…...

Docker-harbor私有仓库
一、Harbor概述 1、Harbor的概念 • Harbor是VMware公司开源的企业级Docker Registry项目,其目标是帮助用户迅速搭建一个企业级的Docker Registry服务 • Harbor以 Docker 公司开源的Registry 为基础,提供了图形管理UI、基于角色的访问控制(Role Base…...

Java之动态规划之子序列问题
目录 0.动态规划问题 一.最长递增子序列 1.题目描述 2.问题分析 3.代码实现 二.最长递增子序列 1.题目描述 2.问题分析 3.代码实现 三.最长重复子数组 1.题目描述 2.问题分析 3.代码实现 4.代码的优化(滚动数组) 四.最长公共子序列 1.题目描述 2.问题分析 3.代…...

java ArrayList
目录 一.简单介绍 二.ArrayList的底层结构 2.1ArrayList的底层结构和操作分析 2.ArrayList 底层源码分析 三.ArrayList 方法 四.代码使用方法 一.简单介绍 ArrayList 类是一个可以动态修改的数组,与普通数组的区别就是它是没有固定大小的限制,我们…...

前端——周总结系列四
1 JS变量与常量 概述 变量:在后续编码过程中会被重新赋值,是不断变化的。常量:固定不变的数据,日常生活比如性别男,代码层面是在编码过程中不会变化的固定数据。 命名规则 变量 可以包含数字,字母&…...

Linux重定向符、管道符讲解
目录 重定向 将命令与文件进行互动 输出重定向 输入重定向 管道符 将命令与命令互动起来 重定向 将命令与文件进行互动 重定向分类 一般情况下,Linux命令运行时都会打开一下三个文件 标准输入文件:stdin文件,文件描述符为0,Li…...

【C++】多态
多态一、多态的概念及定义1.1 虚函数1.2 虚函数重写的特殊情况1.3 override 和 final二、抽象类2.1 概念2.2 用处三、多态的原理3.1 虚函数表3.1.1 虚函数与虚表的位置3.2 多态的原理3.3 静态绑定和动态绑定四、单/多继承的虚函数表4.1 单继承的虚函数表4.2 多继承的虚函数表一…...

分布式项目-品牌管理(5、6)
【今日成果】: //使用阿里云OSS服务: //使用v-if如果地址没有就不显示 , 如果地址错误图片就显示不出来; 【快速回顾】: 任何数据的删除都不要使用物理上的删除,应当使用逻辑上的删除!&…...

自定义ESLint规则开发与使用
自定义eslint及使用 项目结构 |-eslint-plugin-demo //自定义eslint插件项目 | |-demo-app // 使用自定义eslint的测试应用 |-README.md 项目效果: github项目地址 自定义ESLint环境准备 安装脚手架 执行下列命令来安装开发eslint的脚手架。 yo(y…...
【JavaScript】35_包装类与垃圾回收机制
10、包装类 在JS中,除了直接创建原始值外,也可以创建原始值的对象 通过 new String() 可以创建String类型的对象 通过 new Number() 可以创建Number类型的对象 通过 new Boolean() 可以创建Boolean类型的对象 但是千万不要这么做 包装类࿱…...

【CS224W】(task3)NetworkX工具包实践
note 节点可以为任意可哈希的对象,比如字符串、图像、XML对象,甚至另一个Graph、自定义的节点对象。通过这种方式可以自由灵活地构建:图为节点、文件为节点、函数为节点,等灵活的图形式。暂时省略:【B5】计算机网络图…...

ansible的模块详解
ansible 的概述 什么是ansible Ansible是一款为类Unix系统开发的自由开源的配置和自动化工具。 它用Python写成,类似于saltstack和Puppet,但是有一个不同和优点是我们不需要在节点中安装任何客户端。 它使用SSH来和节点进行通信。Ansible基于 Python…...
《Terraform 101 从入门到实践》 Functions函数
《Terraform 101 从入门到实践》这本小册在南瓜慢说官方网站和GitHub两个地方同步更新,书中的示例代码也是放在GitHub上,方便大家参考查看。 Terraform的函数 Terraform为了让大家在表达式上可以更加灵活方便地进行计算,提供了大量的内置函数…...
使用kubeadm快速部署一个K8s集群
wkubeadm是官方社区推出的一个用于快速部署kubernetes集群的工具。 这个工具能通过两条指令完成一个kubernetes集群的部署: # 创建一个 Master 节点 $ kubeadm init# 将一个 Node 节点加入到当前集群中 $ kubeadm join <Master节点的IP和端口 >1. 安装要求 …...
谷歌浏览器插件
项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...

Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...

iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版分享
平时用 iPhone 的时候,难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵,或者买了二手 iPhone 却被原来的 iCloud 账号锁住,这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...

【机器视觉】单目测距——运动结构恢复
ps:图是随便找的,为了凑个封面 前言 在前面对光流法进行进一步改进,希望将2D光流推广至3D场景流时,发现2D转3D过程中存在尺度歧义问题,需要补全摄像头拍摄图像中缺失的深度信息,否则解空间不收敛…...

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1
每日一言 生活的美好,总是藏在那些你咬牙坚持的日子里。 硬件:OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写,"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...
Java 加密常用的各种算法及其选择
在数字化时代,数据安全至关重要,Java 作为广泛应用的编程语言,提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景,有助于开发者在不同的业务需求中做出正确的选择。 一、对称加密算法…...
实现弹窗随键盘上移居中
实现弹窗随键盘上移的核心思路 在Android中,可以通过监听键盘的显示和隐藏事件,动态调整弹窗的位置。关键点在于获取键盘高度,并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...
LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》
这段 Python 代码是一个完整的 知识库数据库操作模块,用于对本地知识库系统中的知识库进行增删改查(CRUD)操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 📘 一、整体功能概述 该模块…...

【C++进阶篇】智能指针
C内存管理终极指南:智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...

Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)
引言 在人工智能飞速发展的今天,大语言模型(Large Language Models, LLMs)已成为技术领域的焦点。从智能写作到代码生成,LLM 的应用场景不断扩展,深刻改变了我们的工作和生活方式。然而,理解这些模型的内部…...