Cookie是由W3C组织提出,最先由NetScape社区发展的一种机制。Cookie是存储于访问者的计算机中的变量。每当同一台计算机经过浏览器请求某个页面时,就会发送这个cookie。其实cookie是一个很小的文本文件,是浏览器储存在用户的机器上的。Cookie是纯文本,没有可执行代码。储存一些服务器须要的信息,每次请求站点,会发送相应的cookie,这些cookie能够用来辨别用户身份信息等做用。cookie能够包含任意的信息,客户端会记录服务器返回来的Set-Cookie首部中的cookie内容。并将cookie存储在浏览器的cookie数据库中,当用户访问同一站点时,在Cookie请求首部发送过去。面试
JavaScript 可使用 document.cookie 属性来建立 、读取、及删除 cookie。
JavaScript 中,建立 cookie 以下所示:chrome
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;浏览器
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.cn
b.e.f.com.cn
e.f.com.cn
f.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区别服务器