1 .cookie是服务器保存在浏览器的一小段文本信息,每个cookie信息的大小一般不能超过4kb,浏览器每次向服务器发送请求,都会自动附上这段信息,puppter每次请求也会加上这段信息吗?
2 .作用
1 .主要用来辨别两个请求是否来自同一个浏览器,以及用来保存一些信息
2 . 对话管理。保存登录,购物车等需要记录的信息
3 .个性化:保存用户的偏好,比如网页的字体大小,背景色等
4 .追踪:记录和分析用户行为
5 .其实就是不需要注册的用户id
3 .组成
1 .cookie名字
2 .cookie的值,真正的数据写在里面
3 .所属域名:默认是当前域名
4 .生效的路径:默认是当前网址。即“/”。这意味着这个cookie对该域名的根路径和他的所有子路径都有效。如果设置为/form,那么这个cookie只有访问www.example/form极其子路径才会有效,以后,浏览器一旦访问这个路径,浏览器就会附上这段cookie发送给服务器
5 .
4 .其他知识
1 .浏览器可以设置不接受cookie,也可以设置不向服务器发送cookie.window.navigator.cookieEnabled属性返回一个布尔值,表示浏览器是否打开cookie这个功能
2 .单个域名设置的cookie不超过30个,每个cookie的大小不能超过4kb,超过限制之后,cookie将被忽略,不会被设置
3 .浏览器的同源政策规定,只要两个网址的域名和端口相同,就可以共享cookie.注意这里是不要求协议相同的。
4 .
Cookie的生成
1 .服务器如果希望在浏览器保存Cookie,就要在http回应的头信息里面,放置一个Set-cookie字段
2 .Http回应可以包含多个set_cookie字段,即在浏览器生成多个cookie
3 .除了cookie的值,set_cookie字段还可以附加cookie的属性,也就是那些属性
4 .一个set-cookie字端里面,可以同时包括多个属性,没有次序的要求。
5 .浏览器如果想要改变一个之前设置好的cookie,必须同时满足四个条件,cookie的key,domain,path,secure都匹配。举例来说,原始的cookie是用如下的set-cookie设置的。改变这个值就必须是用同样的set-cookie来操作。那要是用户自己修改了,那岂不是再也不能修改了?
6 .只要有一个属性不同,就会生成一个新的cookie,而不是替换掉原来那个cookie.
7 .他其实就相当于一个请求返回,但是返回的内容不是response部分,而是在更加底层的部分做了处理
Cookie的发送
1 .浏览器向服务器发送http请求时,每个请求都会带上相应的Cookie.也就是说,把服务器早前保存在浏览器的这段信息,再发回服务器,要使用http头信息的Cookie字段
2 .cookie可以包含多个Cookie,使用分号;相隔
3 .服务器收到浏览器发来的Cookie时,无法知道Cookie的各种属性,比如何时过期,哪个域名设置的cookie,
cookie的属性
1 .Expires,Max-age
1 .expires属性指一个固定的到期时间,到了指定时间之后,浏览器就不再保留这个Cookie.他的值是utc格式
2 .如果expires不设置或者设为null,Cookie只会在当前会话有效,浏览器窗口一旦关闭,当前Session结束,该session就会被删除
3 .浏览器是根据本地时间,而不是网络时间来决定cookie是否过期,由于本地时间不是一定精确的,所以其实还是没有办法保证cookie一定会在服务器指定时间过期
4 .max-age:属性指定了从现在开始cookie存在的秒数,到了这个秒数之后就不在保存这个cookie
5 .同时指定了Expires和max-age,那么max-age的值将会优先
6 .
2 .Domain,Path
1 .domain是指浏览器发出http请求时,哪些个域名要附带这个cookie,如果没有指定这个属性,浏览器会默认设置为当前域名,这时子域名将不会附带这个cookie如果服务器指定的域名不属于当前域名,浏览器会拒绝这个cookie
2 .Path 属性是指浏览器发出HTTP请求时,哪些路径要附带Cookie,只要浏览器发现,path属性是http请求路径开头的一部分,就会在头信息里面带上这个Cookie,比如PATH属性是/,那么请求/docs路径也会包含该Cookie.当然,前提是域名必须一致。
3 .
3 .secure,HttpOnly
1 .Secure属性指定浏览器只有在加密协议https下,才能将这个cookie发送到服务器,另一方面,如果当前协议是http,浏览器会自动忽略服务器发来的Secure属性,该属性只是一个开关,不需要指定值。如果通信时https协议,该开关自动打开
2 .HttpOnly:属性指定该cookie无法通过js脚本拿到,主要是document.cookie属性,xmlHttprequest对象和request api都拿不到该属性。这样就防止了该cookie被脚本读到,只有浏览器发出http请求时,才会带上该cookie.
3 .
document.cookie
1 .用于读写当前网页的cookie
2 .写入的时候,cookie的值必须写成是key=value的形式。注意,等号两边都不能有空格。另外写入Cookie的时候,必须对分号,逗号和空格进行转义
3 .document.cookie一次只能写入一个Cookie,而且写入的并不是覆盖,而是添加
4 .有很明显的读写差异:一次可以读出所有的Cookie,而只能写入一个Cookie.和http协议的cookie通信格式有关。浏览器向服务器发送cookie的时候,cookie字段是使用一行将所有cookie全部发送;服务器向浏览器设置cookie的时候,set-cookie字段是一行设置一个cookie
5 .删除一个现存cookie的唯一办法,就是设置他的expires属性为一个过去的日期。
6 .