Cookie详细理解
为什么要提cookie
在很多人看来,提及cookie必定要说session,但是我这里说的不是session,而是想从web前端的角度详细说明下cookie;cookie的设置服务器端和客户端都可以做,这里先看服务器端,以我较为熟悉的jsp为例:
与此对应的客户端的cookie对应的操作方法,我们也可以在mdn查到:
实际浏览器中的api只有一个document.cookie:
它是一个可读写的属性,所以客户端完全可以依据这个属性封装一套cookie操作的api,这里我摘取一段jquery.cookie.js的源码:
这里详细介绍下三个属性
1.max-age和expires: 这两个属性类似,与页面缓存的机制类似;max-age是较新的属性,max-age以时间段为单位,比expires的优势就在于解决了服务器端和客户端时间不同步的问题。由于document.cookie中没有直接的删除api。所以一般删除cookie使用的是max-age=0或者负数或者expires设置为一个过去的时间。
2.path: 用于设置cookie的相对路径,举个例子
上面的例子说明了如下问题:
1.如果不设置domain。cookie默认设置在当前最子级域名下;
2.域名相同的情况下,path的设置没有限制(即可以在任何页面设置任何path,也就是说可以在子页面中设置path为根目录,也可以在根目录下设置path在子目录下)。
3.当且页面目录下的所有url,还有目录的所有子目录可以访问到当前path的cookie。但是path如果设置为子目录。父目录中读取不到。
在这个地方我是有一次遇到问题,有深切体会。
3.domain:用于设置cookie在哪个域名下
总结与设想类似。子域名下的永远能访问到父域名下的cookie。但是跨域的读取不到。
这个我们的项目也是有实际的使用场景。做宠物商城,以1014这个为宠物店标识,不同的宠物店三级域名是不一样的。这个时候就要将一个公用的cookie设置到二级以上的域名
4.secure: 用于设置cookie加密传输
这个没实际用过,拉上mdn的一句话,理解起来其实也很简单
;secure Cookie to only be transmitted over secure protocol as https. Before Chrome 52, this flag could appear with cookies from http domains.
另外还有一点:jsapi似乎并不能读取这些属性。document.cookie永远返回这种格式
“sname=zhuo; JSESSIONID=aaa6225A_CoOdfocn49Gv; sid=AA8yXxJNfRhAVUPHs%2F%2F3Jd6s9IGzGKgq6HPYTGawjDA%3D; testdomain=domain%20value”
只有使用chrome devtools查看这些详细属性