上文有提到 Cookie 与 Session 都产生于用来解决 HTTP 协议的无状态,无链接的特色,那么到底什么能够被称做“无状态”呢?
因而咱们能够简单整理一下通讯的过程(见下图),位于应用层如下的TCP/IP协议对数据的层层封装,使得咱们从一个客户端到服务端(或者能够说另外一个客户端)的数据交换看起来是端到端的,隐藏一层又一层的数据封装和校验。
那么,“无状态”在这个模型中到底体如今什么地方呢?粗略的能够理解为【C端是一个求爱者,S端是一我的见人爱的女神】,
我从C端给S端发了一句“你喜欢我吗”,
S端回复了一句“喜欢呀”,
C端再问“你喜欢我什么”
S端却回了一句“我何时喜欢你了”
......
其实我意在说明,“无状态”即为无感情,无上下文,是一次匿名的交互,写这个前看了许多文章中,把“无状态”归为HTTP协议的_缺陷_,可是我以为更是一种_特色_,从WIKI百科的描述中能够见到这句话php
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端来分别维护“我是谁”的状态。
若是想听更好的故事,下面的可能更加的奏效web
常去的一家咖啡店有喝5杯咖啡免费赠一杯咖啡的优惠,然而一次性消费5杯咖啡的机会微乎其微,这时就须要某种方式来纪录某位顾客的消费数量。想象一下其实也无外乎下面的几种方案:
一、该店的店员很厉害,能记住每位顾客的消费数量,只要顾客一走进咖啡店,店员就知道该怎么对待了。这种作法就是协议自己支持状态。
二、发给顾客一张卡片,上面记录着消费的数量,通常还有个有效期限。每次消费时,若是顾客出示这张卡片,则这次消费就会与之前或之后的消费相联系起来。这种作法就是在客户端保持状态。
三、发给顾客一张会员卡,除了卡号以外什么信息也不纪录,每次消费时,若是顾客出示该卡片,则店员在店里的纪录本上找到这个卡号对应的纪录添加一些消费信息。这种作法就是在服务器端保持状态。
先引用一句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程序来解释吧浏览器
后端代码:服务器
<?php session_start(); setcookie('name','tao') ; setcookie('gender','male') ; var_dump(session_id()); var_dump($_COOKIE);
第一次访问;
$_COOKIE并无值cookie
第二次访问:
$_COOKIE有值了session
因此能够很明显的看出,setcookie()对于 $_COOKIE 的影响并非当即生效的.这是由于setcookie()是用来给客户端发送一个HTTP Cookie 的值, 可是 $_COOKIE 则是来获取客户端传递的 Cookie 值。因此二者的做用域不同。所以才会出现这种状况。app
关于 Session 和 Cookie 的理解就到此为止,我以为应该设计到更多知识,包括但不限于浏览器的运行机制,Cookie 实现机制, Session 持久化,php.ini 对session的影响etc.ide
若是有不对的地方,记得来交互意见 :)网站