什么是Cookie?
Cookie是指某些网站为了辨别用户身份而存储在用户本地终端上的数据(通常经过加密)。
为什么要辨别用户身份?
很多时候Web应用是有状态的,需要保存用户登录的身份信息,一般的购物网站就是如此。
然而,服务器使用HTTP与Web应用进行信息交流。HTTP协议是无状态的协议,无状态协议是指web应用每次向服务器发送的请求都是独立的HTTP连接。Web应用和服务器会在第一个请求完成后关闭连接通道,第二次请求时重新建立连接。服务器并不区分哪个请求来自哪个客户端,对所有请求都一视同仁,都是单独的连接。
那么问题来了,在访问页面1时执行了登录动作,在访问页面2的时候如何才能告知服务器刚才已经登录过了呢?
答案就是使用Cookie。浏览器和服务器之间有约定-通过使用Cookie技术来维持应用的状态。
Cookie能做什么?
保存用户状态;记录用户行为
Cookie如何管理?
很多网站都会颁发Cookie。Google会给客户端颁发,BaiDu也会颁发。那众多的Cookie是被谁管理的?如何管理?访问Google时是否会带上BaiDu颁发的Cookie呢?
Cookie在客户端由浏览器进行管理。浏览器根据域名来管理Cookie。
Cookie具有不可跨域名性,浏览器可以保证访问Google时只携带Google颁发的Cookie。访问Baidu同理。
不同的域名之间不可以访问或者修改删除对方的Cookie。
Cookie的几个属性
name:Cookie名
value:Cookie值
domain:Cookie所属的域
secure:仅在HTTPS安全通信时发会发送Cookie。
HttpOnly:加以限制,使Cookie不能被JavaScript脚本访问
Expires:Cookie的过期时间,默认值为session,关闭当前会话session就会失效
Max-Age:用来代替expires.Max-Age以秒为单位,为正数时表示Cookie从创建到过期所能存在的时间,在此期间,不论关闭电脑还是浏览器,直至设置时间Cookie才会过期。 未负数时,表示只Cookie只是存储在浏览器内存里,只要关闭浏览器,此Cookie立刻失效。 Max-Age的默认值为-1
操作Cookie
在JavaScript中可以通过document.cookie获取Cookie或设置Cookie。
由于Cookie常用来在客户端和服务器端进行通信,因此一些服务端语言也可以操作Cookie,如PHP。
JavaScript提供的操作Cookie的方法非常有限。
添加Cookie
当前域名下的Cookie信息如下图
document.cookie="acookie=hahhahah"
再次查看,显示已经添加成功
删除Cookie
删除Cookie的方法有二,一是将该Cookie的值置为空,二是将该Cookie的expires设置为一个过去的时间。
禁止Cookie
为了安全起见,在很多时候会禁止前端访问Cookie,这时设置HttpOnly属性即可。
response.addHeader("Set-Cookie", "uid=112; Path=/; HttpOnly");
Cookie的大小数目
所有浏览器对于Cookie的数目和大小都是有限制的,不同的浏览器之间略有不同。
一般来说,Cookie的数目限制在20个左右,大小限制在4kb上下。
在所有的浏览器中,大小 、数目超过限制会被直接忽略,不会被设置成功。
Cookie的应用过程
- 客户端第一次请求是没有Cookie信息的
- 服务器端收到请求,生成cookie,并保存起来
- 在响应报文的首部字段 set-Cookie塞入Cookie,通知客户端保存Cookie
- 下次客户端再次往该服务器发送请求时,客户端会自动在请求报文中加入Cookie后发送出去
- 服务器端发现客户端发送过来的Cookie后,先去检查是从哪一个客户端发来的连接请求,然后对比服务器上的记录,最后得到之前的状态信息