资讯专栏INFORMATION COLUMN

Cookie 与 Session 详(hu)解(che)【拿去面试用】

zhaofeihao / 2151人阅读

摘要:于是和就出现了,用于在端和端来分别维护我是谁的状态。这种做法就是协议本身支持状态。每次消费时,如果顾客出示这张卡片,则此次消费就会与以前或以后的消费相联系起来。所以两者的作用域不一样。因此才会出现这种情况。

1、Cookie

Cookie 是浏览器访问服务器后,服务器传给浏览器的一段数据

该数据以一个称为“Set-Cookie”的 HTTP 报头格式从 Web 服务器发出。 浏览器以称为“Cookie”的 HTTP 报头格式将 Cookie 送回服务器

Cookie 在浏览器端是以文件形式保存的

此后每次浏览器访问该服务器,都必须带上这段数据

包含多个字段 "过期时间"、"路径"、"域名"

Cookie 是在客户端保持状态的方案,补充 HTTP 无状态协议的特点

2、Session

Session 是在服务端保持状态的方案

用户打开浏览器访问网站,服务端生成的sessionID,传递到浏览器的 Cookie 保存 ,在每次请求时都会自动带上 sessionID ,然后服务器端根据 sessionID 找到对应的 Session 值

3、HTTP协议

上文有提到 Cookie 与 Session 都产生于用来解决 HTTP 协议的无状态,无连接的特点,那么到底什么可以被称作“无状态”呢?
于是我们可以简单整理一下通信的过程(见下图),位于应用层以下的TCP/IP协议对数据的层层封装,使得我们从一个客户端到服务端(或者可以说另一个客户端)的数据交换看起来是端到端的,隐藏一层又一层的数据封装和校验。
那么,“无状态”在这个模型中到底体现在什么地方呢?粗略的可以理解为【C端是一个求爱者,S端是一个人见人爱的女神】,
我从C端给S端发了一句“你喜欢我吗”,
S端回复了一句“喜欢呀”,
C端再问“你喜欢我什么”
S端却回了一句“我什么时候喜欢你了”
......
其实我意在说明,“无状态”即为无感情,无上下文,是一次匿名的交互,写这个前看了许多文章中,把“无状态”归为HTTP协议的_缺陷_,但是我觉得更是一种_特点_,从WIKI百科的描述中可以见到这句话

High-traffic websites often benefit from web cache servers that deliver content on behalf of upstream servers to improve response time

可以将其理解为,HTTP协议为“高速通信”带来了好处,也是历史选择了这种机制。但是随着发展,我们需要不能再匿名的去交流,我们需要知道对方是谁,我们期待下面的对话场景:
C端:“你喜欢我吗”
S端:“喜欢你啊”
C端:“喜欢我什么”
S端:“所有”
......
emmmmmm...这可能是我们想要的效果,我们需要知道对方是谁,知道上下文是什么,需要维护对方是谁的这个_状态_。于是 Cookie 和 Session 就出现了,用于在C端和S端来分别维护“我是谁”的状态。
如果想听更好的故事,下面的可能更加的奏效

常去的一家咖啡店有喝5杯咖啡免费赠一杯咖啡的优惠,然而一次性消费5杯咖啡的机会微乎其微,这时就需要某种方式来纪录某位顾客的消费数量。想象一下其实也无外乎下面的几种方案: 
1、该店的店员很厉害,能记住每位顾客的消费数量,只要顾客一走进咖啡店,店员就知道该怎么对待了。这种做法就是协议本身支持状态。
2、发给顾客一张卡片,上面记录着消费的数量,一般还有个有效期限。每次消费时,如果顾客出示这张卡片,则此次消费就会与以前或以后的消费相联系起来。这种做法就是在客户端保持状态。
3、发给顾客一张会员卡,除了卡号之外什么信息也不纪录,每次消费时,如果顾客出示该卡片,则店员在店里的纪录本上找到这个卡号对应的纪录添加一些消费信息。这种做法就是在服务器端保持状态。

4、Cookie 与 Session 的关系

先引用一句WIKI 上在介绍Session时候对Cookie的解释吧

Client-side sessions use cookies and cryptographic techniques to maintain state without storing as much data on the server. When presenting a dynamic web page, the server sends the current state data to the client (web browser) in the form of a cookie. The client saves the cookie in memory or on disk. With each successive request, the client sends the cookie back to the server, and the server uses the data to "remember" the state of the application for that specific client and generate an appropriate response.

我就翻译第一句话吧. 客户端session使用cookie和加密技术来保持状态
可以很容易的发现,他们的作用大致一样,存储位置不同,
下面再用一段PHP程序来解释吧

后端代码:


第一次访问;
$_COOKIE并没有值

第二次访问:
$_COOKIE有值了

所以可以很明显的看出,setcookie()对于 $_COOKIE 的影响并不是立即生效的.这是因为setcookie()是用来给客户端发送一个HTTP Cookie 的值, 但是 $_COOKIE 则是来获取客户端传递的 Cookie 值。所以两者的作用域不一样。因此才会出现这种情况。

5、写在最后

关于 Session 和 Cookie 的理解就到此为止,我觉得应该设计到更多知识,包括但不限于浏览器的运行机制,Cookie 实现机制, Session 持久化,php.ini 对session的影响etc.

如果有不对的地方,记得来交互意见 :)

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/28530.html

相关文章

  • 【C语言】超☀️指针是个什么针?(一次性搞定指针问题)

    目录 前言 一、 什么是指针? 引例 计算机是怎么对内存单元编号的呢? 内存空间的地址如何得到 想存地址怎么办? ​ 本质目的不是为了存地址  二、指针和指针类型 为什么有不同类型的指针 1.指针的解引用 2.指针+-整数 三、野指针 造成野指针的原因 1.未主动初始化指针  2.指针越界访问 3.指针指向的空间释放 规避野指针 四、指针运算 1.指针+-整数  2.指针-指针  3.指针的关系运...

    tigerZH 评论0 收藏0
  • python模拟登录segmentfault及备份文章

    摘要:继续尝试,成功,但是还是未登录状态。如前所说,用模拟登录拿到,然后带上去取文章备份就好了,用加了点并发,代码放到上了,地址,欢迎使用及拍砖以上 直接post登录失败 一般的网站确实直接post之后就登录成功了,然后拿到cookie想怎么玩就怎么玩。不过的确世事难料,失败在所难免。 首先是人肉登录,用chrome的network栏查看post了些什么东西,有三项: mail passw...

    DrizzleX 评论0 收藏0
  • 数据工程师妹子养成手记——数据库篇

    摘要:是什么呀是一个和不太一样的数据库。怀疑是同时联了四个集合的数据造成的。这本书的定位是和的应用,所以有意弱化了数据库的搭建维护和底层优化。所以本书可能不适合数据库工程师。 这篇文章没有代码,请放心阅读。 程序员最宝贵的东西是生命,生命属于程序员只有一次。一个程序员的一生应该这样度过:当她回首往事的时候,她不会因为搭建环境浪费时间而悔恨,也不会因为集群无法运行而羞耻。这样,在她开发的时候,...

    yexiaobai 评论0 收藏0

发表评论

0条评论

zhaofeihao

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<