十二、Cookie

cookie 是从网站发送并存储在用户本地计算机上的一段数据。它们提供了一个持久的存储空间,允许网站在用户在页面之间移动或返回网站时记住他们。

创建 Cookies

Cookies 是通过给document.cookie对象分配一个名称-值对来创建的。它们仅限于存储字符串值。

document.cookie = "cookie1=mycookie";

相同的对象用于检索 cookie 字符串。

console.log(document.cookie); // "cookie1=mycookie"

要修改一个 cookie,你只需要给它分配一个新值。这将覆盖以前的 cookie。

document.cookie = "cookie1=first";

当另一个名称-值对被分配给cookie对象时,另一个 cookie 被自动创建。

document.cookie = "cookie2=second";

引用cookie对象检索一个字符串,该字符串包含所有 cookies 的分号分隔列表。

console.log("document.cookie"); // "cookie1=first;cookie2=second"

通过使用 string 对象的split方法,可以从 cookie 字符串中提取每个名称-值对。方法返回包含拆分值的数组,这些值根据作为参数指定的分隔符进行拆分。

var dataList = document.cookie.split(";");

console.log(dataList[0]); // "cookie1=first"

console.log(dataList[1]); // "cookie2=second"

再次使用split可以将名称与值分开。

var pair = dataList[0].split("=");

console.log(pair[0] + " is " + pair[1]); // "cookie1 is first"

编码

cookie 的名称-值对不能包含空格、逗号或分号。为了确保不包含这些字符,可以使用全局escape方法对字符串进行 URL 编码。

document.cookie = "cookie1=" + escape("Foo Bar");

在 URL 编码格式中,空格被替换为%20。

console.log(document.cookie); // "cookie1=Foo%20Bar"

当读回 cookie 字符串时,unescape方法用于撤销编码。

console.log(unescape(document.cookie)); // "cookie1=Foo Bar"

到期日期

除了名称-值对之外,cookie 字符串还可以包含其他信息,比如 cookie 应该何时过期。默认情况下,cookie 的生命周期限于当前浏览器会话。当用户关闭窗口时,该会话结束,之后浏览器删除 cookie。使用内置的Date对象及其toGMTString方法,以下面的方式设置到期日期。通过将这个毫秒数加到由getTime方法返回的值上,这个 cookie 被设置为一小时后过期。

var mycookie = "cookie1=first";

var date = new Date();

date.setTime(date.getTime() + (60*60*1000));

document.cookie = mycookie + ";expires=" + date.toGMTString();

这个截止日期也提供了删除 cookies 的方法。这是通过使用旧的到期日期重新创建同一个 cookie 来实现的,在本例中,到期日期是过去的一天。

var name = "cookie1";

var date = new Date();

date.setDate(date.getDate() - 1);

document.cookie = name + '=;expires=' + date.toGMTString();

请注意,只需要 cookie 的名称来标识要覆盖哪个 cookie。因此,值部分为空。

路径和域

为了访问 cookie,文档必须位于相同的域中,并且具有由 cookie 指定的相同路径。默认情况下,该路径是包含创建 cookie 的文档的文件夹的位置。以下示例说明了如何使 cookie 对给定域中的所有路径可见。

var mycookie = "cookie1=first";

var path = "path=/";

document.cookie = mycookie + ";" + path;

域默认为文档所在位置的主机部分,比如www.example.com。为了使 cookie 对该域的其他子域可用,可以省略www部分,如下例所示。

var domain = "domain=.example.com";

document.cookie = mycookie + ";" +  domain + ";" + path;

域、路径和过期选项可以按任意顺序出现。请记住,一旦设置了这些可选参数,就不可能从 cookie 中检索它们。