Cookie存在的意义:
- 个人感觉是为了方便用户,当一个用户再去访问之前访问过的网站时,由于有Cookie的存在就不需要再次输入信息(比如某网站需要登录输入用户名和密码,第二次登录时就不不需要再次输入)。由于HTTP协议是无状态的,但是服务器端的业务必须是有状态的,Cookie就是用来存储Web中的状态信息,来方便服务器端的使用。
无状态解释:用户请求时,浏览器和服务器是不知道该用户做了什么。因为浏览器和服务器通信是通过socket套接字进行的,当服务器将请求结果返回给浏览器和处理完页面之后,会关闭socket连接并且销毁页面对象。但是有时候需要保存用户的状态,比如说记录用户是否登陆过,浏览过哪些信息等等。)
Cookie实现的机制
- (1)当用户通过浏览器客户端第一次访问某网站时,服务端会组织一个Cookie信息,在响应报文里带上该Cookie信息(在响应报文头部加入:Set_Cookie : name = value),并且把该信息存储到本服务器上(Session)。
- (2)浏览器客户端收到HTTP响应报文后会检查Set_Cookie字段,将其信息保存到浏览器。当用户再次使用该浏览器客户端访问该网站时,会带着之前保存的Cookie信息(在HTTP请求头部加入Cookie : name = value)。
- (3)服务端会根据Cookie信息与本服务器上存储的Session进行匹配,以此来判断该浏览器客户端之前是否访问过(Cookie存储在浏览器,Session存储在服务器端)
Cookie的组成:
Cookie的内容主要包括:
- 名字-name(必需)
- 值-value(必需)
- 过期时间-expire(可选)
- 路径-path(可选)
- 域名-domain(可选)
- 安全标志-secure(可选):规定是否使用安全的HTTPS协议连接来传输Cookie
Cookie是否相同是由名字和路径共同决定的:
- 名字相同,不设置路径的话算是相同的Cookie,后面的覆盖前面的
- 名字相同,设置了不同的路径,算是不同的Cookie
- Cookie默认的路径为当前请求URL的路径
例如:
Set-Cookie: name=”Amin”;expires:Mon, 21-07-2020 00:00:00 GTM;domain=”tencent.com”;path=/;secure
上面Cookie的名称为name,它的值为”Amin”,到2020年7月21的凌晨过期,对于tencent.com和www.tencent.com及其子域都有效,并且该cookie是安全的,意思是只能通过SSL连接(如HTTPS)来发送,仅仅用HTTP协议是不能发送的。
- 路径和域一起构成了Cookie的作用范围。
- 过期时间如果为零时表示删除同名的Cookie数据。
- 过期时间如果不设置或者为负整数的话,那么该Cookie的生命周期随浏览器会话,浏览器会话关闭,Cookie消失,这种Cookie叫作会话Cookie,会话Cookie存储在内存中。
- 如果设置了过期时间(正整数),那么该Cookie会存储在硬盘上,关闭浏览器再次打开时这些Cookie依旧有效,直到设定的过期时间为止。存储在硬盘上的Cookie可以在不同浏览器进程间共享。
Cookie只能保存非中文字符串数据类型,浏览器一般只允许存放300个Cookie,每个Cookie的大小限制为4KB(4096Byte),每个站点(域名)存放Cookie的数量也是有限制的。
- IE6及以下的浏览器每个域名最多包含20个Cookie;
- IE7及以上的浏览器每个域名最多50个Cookie;
- Firefox每个域名最多50个Cookie;
- Sarafi和Chrome对每个域的Cookie数目没有严格限制。
删除Cookie的方式:
- 通过浏览器直接删除Cookie
- 将Cookie中的时间设置为已经过去的时间
- 给Cookie赋空值
本人也是学习总结,如有错误之处,欢迎指正,不胜感激!