乐趣区

关于Cookie的那些事

1 Cookie 简介
Cookie 是由 W3C 组织提出,最早由 NetScape 社区发展的一种机制。Cookie 是存储于访问者的计算机中的变量。每当同一台计算机通过浏览器请求某个页面时,就会发送这个 cookie。其实 cookie 是一个很小的文本文件,是浏览器储存在用户的机器上的。Cookie 是纯文本,没有可执行代码。储存一些服务器需要的信息,每次请求站点,会发送相应的 cookie,这些 cookie 可以用来辨别用户身份信息等作用。cookie 可以包含任意的信息,客户端会记录服务器返回来的 Set-Cookie 首部中的 cookie 内容。并将 cookie 存储在浏览器的 cookie 数据库中,当用户访问同一站点时,在 Cookie 请求首部发送过去。
2 JavaScript 操作 cookie
JavaScript 可以使用 document.cookie 属性来创建、读取、及删除 cookie。JavaScript 中,创建 cookie 如下所示:
document.cookie=”username=John Doe”;
您还可以为 cookie 添加一个过期时间(以 UTC 或 GMT 时间)。默认情况下,cookie 在浏览器关闭时删除:
document.cookie=”username=John Doe; expires=Thu, 18 Dec 2043 12:00:00 GMT”;
您可以使用 path 参数告诉浏览器 cookie 的路径,domain 参数告诉浏览器 cookie 的域名。默认情况下,cookie 属于当前页面。
document.cookie=”username=John Doe; expires=Thu, 18 Dec 2043 12:00:00 GMT; path=/; domain= .abc.com”;
在 JavaScript 中, 可以使用以下代码来读取 cookie:
var x = document.cookie;
document.cookie 将以字符串的方式返回所有的 cookie,类型格式:cookie1=value; cookie2=value; cookie3=value;
3 关于 cookie 的 domain
domain 的含义为域。假设有两个域名域名 A a.b.e.f.com.cn 域名 B c.d.e.f.com.cn 域名有分级的概念,也就是说域名 A 与域名 B 都是 f.com.cn 的子域名,f.com.cn 又是 com.cn 的子域名在域名 A 所使用的服务中,可以设置域名 a.b.e.f.com.cnb.e.f.com.cne.f.com.cnf.com.cn 在服务端设置 domain 的时候,设置 domain 为 b.e.f.com.cn 或.b.e.f.com.cn 没有区别,注意前面的点,即只要是为 cookie 显式的声明 domain,前面带不带点没有区别。这个点的奥妙后面还会提到。设置其他域名虽然可以在响应头中有 set-cookie 的头,但是出于安全考虑,该头会被浏览器忽略,并不会产生真实的 cookie,有一点注意,虽然在域名上来说,f.com.cn 是 com.cn 的子域,但是浏览器是不会接收 domain 为 com.cn 的 cookie 的,那样互联网就乱套了。对于域名 A 下的 cookie,域名 B 可以拿到 e.f.com.cn,f.com.cn 这两个 domain 下的 cookie,互联网上说的单点登录,就是以这个原理实现的。如果存在相同名的 cookie 不同 domain 呢?比如域名 A 设置设置 domain 为 e.f.com.cn 的 cookie,mykey=myvalue1。而在域名 B 中设置 domain 为 c.d.e.f.com.cn 的 cookie,mykey=myvalue2。此时在域名 B 服务端能拿到两个 cookie 都为 mykey=myvalue,并不存在覆盖一说。注意在域名 B 中如果设置 domain 为 e.f.com.cn 的 cookie,mykey=myvalue3. 此时会覆盖域为 e.f.com.cn 的 mykey 的值,即浏览器中,同一个域,只存在一个名为 mykey 的 cookie。如果不显式设置 cookie,默认当前域名这种说法对不对呢?先说第一个问题,如果不显示设置 cookie,那么浏览器会生成一个只针对当前域名的 cookie,什么叫只针对当前域名呢?如果有一个域名就是 e.f.com.cn,在该域名下设置的 cookie 如果没有显示 domain,在回写浏览器的时候浏览器会特殊处理, 如果是火狐,你会发现该 cookie 的信息,有一个主机项,而域项消失了,在 chrome 中,虽然有域这个项,但是域的前面少了一个点,就是上面所说的,如果显示声明,不管域中带不带点,到 chrome 中,都是带点存储的,只有非显式声明域的 cookie,浏览器存储才是不带点的,问题就在这,在 e.f.com.cn 服务主机中生成的 cookie,只有 e.f.com.cn 的服务器能拿到,此时子域名是拿不到这个 cookie 的。、
扩展
对于前后端涉及到的跨域问题可以查找 withCredentials 相关资料面试问题经常问到的关于 cookie 的问题 cookie 与 session 区别 cookie 与 localstorage 区别

退出移动版