深入理解Cookie和Session机制
首先为了让我们能够对Cookie和Session有一个初步的理解,先给出一个问题和一个例子来引出Cookie和Session,然后随后带着问题再去思考Cookie和Session二者的机制。
问题1:为什么我们在浏览网页的时候,会发现它会自动的给你推送一些内容,推送的这些内容并不是随机的,
是一些与我们之前浏览过的网页相关的这些内容,它是如何做到的了?
核心知识点:
Cookie和Session都可以用来保存信息,比如注册信息、浏览记录等,
只是二者储层的地点不同,行使的功能可以说是类似的,许多时候Session会使用Cookie从客户端携带SessionID,这时双方唯一的联系了。
例子1:理解Cookie和Session以及HTTP协议。
比如一个人喜欢喝咖啡,经常去一家咖啡店喝咖啡,这家咖啡店最近举行买5杯送一杯的活动,
但是一次买五杯显然不可能,这个时候就需要某种方式来记录某位顾客消费的数量,
想象一下无非以下几种方案:
- 该店的店员很厉害,能记住每位顾客的消费数量,只要顾客一走进咖啡店,店员就知道该怎么对待了,这种做法就是协议本身支持状态。
- 发给顾客一张卡片,上面记录着消费的数量,一般还有有效期限。每次消费时,如果顾客出示这张卡片,则此次消费就会与之前或以后的消费相联系起来。这种做法就是在客户端保存状态。这张卡片可以想象成Cookie
- 发给顾客一张会员卡,除了卡号之外什么信息也不记录,每次消费时,如果顾客出示这张卡片,则店员在店里的记录本上找到这个卡号对应的记录添加一些消费信息。这种做法就是在服务器端保持状态。这张卡片可以想象成Cookie,卡号是SessionID,而店里的记录本可以看作是Session。
现在我想大家应该对Session、Cookie有了一个定位。很多时候它们可以形式同样的功能,关键是你想用它来做什么。
1.HTTP协议与无状态
HTTP协议本身是一种无状态的,这与HTTP本来的目的是相符的,客户端只需要简单的向服务器发起请求,无论是客户端还是服务器都没有必要记录彼此过去的行为,每一次请求之间都是独立的。
但是很多时候我们想要按需生成一些功能,让服务器或客户端能够记录一些以往的操作和选择。
这时Cookie就诞生了,Cookie的作用就是为了解决HTTP协议无状态的问题,后面出现的Session机制也是一种在客户端与服务器之间保存状态的解决方案。
2.Session和Cookie的联系和区别
具体来说cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案。
同时我们也看到,由于采用服务器端保持状态的方案在客户端也需要保存一个标识,
所以session机制可能需要借助于cookie机制来达到保存标识的目的,但实际上它还有其他选择。
cookie机制。正统的cookie分发是通过扩展HTTP协议来实现的,
服务器通过在HTTP的响应头中加上一行特殊的指示以提示浏览器按照指示生成相应的cookie。
然而纯粹的客户端脚本如JavaScript或者VBScript也可以生成cookie。
而cookie的使用是由浏览器按照一定的原则在后台自动发送给服务器的。
浏览器检查所有存储的cookie,如果某个cookie所声明的作用范围
大于等于将要请求的资源所在的位置,则把该cookie附在请求资源的HTTP请求头上发送给服务器。
cookie的内容主要包括:名字,值,过期时间,路径和域。
路径与域一起构成cookie的作用范围。若不设置过期时间,则表示这个cookie的生命期为浏览器会话期间,关闭浏览器窗口,cookie就消失。
这种生命期为浏览器会话期的cookie被称为会话cookie。
会话cookie一般不存储在硬盘上而是保存在内存里,当然这种行为并不是规范规定的。
若设置了过期时间,浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie仍然有效直到超过设定的过期时间。
存储在硬盘上的cookie可以在不同的浏览器进程间共享,比如两个IE窗口。而对于保存在内存里的cookie,不同的浏览器有不同的处理方式session机制。
session机制是一种服务器端的机制,服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息。
当程序需要为某个客户端的请求创建一个session时,服务器首先检查这个客户端的请求里是否已包含了一个session标识(称为session id),
如果已包含则说明以前已经为此客户端创建过session,服务器就按照session id把这个session检索出来使用(检索不到,会新建一个),
如果客户端请求不包含session id,则为此客户端创建一个session并且生成一个与此session相关联的session id,
session id的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个session id将被在本次响应中返回给客户端保存。
保存这个session id的方式可以采用cookie,这样在交互过程中浏览器可以自动的按照规则把这个标识发送给服务器。
一般这个cookie的名字都是类似于SEEESIONID。但cookie可以被人为的禁止,则必须有其他机制以便在cookie被禁止时仍然能够把session id传递回服务器。
经常被使用的一种技术叫做URL重写,就是把session id直接附加在URL路径的后面。还有一种技术叫做表单隐藏字段。
就是服务器会自动修改表单,添加一个隐藏字段,以便在表单提交时能够把session id传递回服务器。比如:
<form name="testform" action="/xxx"> <input type="hidden" name="jsessionid" value="ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764"> <input type="text"> </form>
实际上这种技术可以简单的用对action应用URL重写来代替。
cookie 和session 的区别:
1、cookie数据存放在客户的浏览器上,session数据放在服务器上。
2、cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗考虑到安全应当使用session。
3、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能考虑到减轻服务器性能方面,应当使用COOKIE。
4、单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。
5、所以个人建议:
将登陆信息等重要信息存放为SESSION
其他信息如果需要保留,可以放在COOKIE中