JavaScript Cookie 机制详解:设置、读取、删除与通用函数封装
本文详细介绍 JavaScript 中 Cookie 的核心机制及其实际应用。内容涵盖 Cookie 的概念、存储原理、安全性限制,以及通过 document.cookie 进行名值对设置、特殊字符编码、过期时间管理、路径与域名控制的具体方法。此外,文章提供了获取、删除 Cookie 的逻辑解析,并封装了 addCookie、getCookie 和 deleteCookie 三个通用处理函数,帮助开发者实现代码复用与高效管理。
JavaScript Cookie 机制概述
Cookie 概述
在前一章节中,我们曾利用一个固定不变的框架来存储购物车数据,而商品展示页面则是动态变化的。虽然这种方式能模拟全局变量的效果,但存在严谨性不足的问题。例如,若在导航框架页面内右键点击快捷菜单中的【刷新】命令,所有 JavaScript 变量都会随之丢失。因此,若需实现严格的跨页面全局变量共享,此方法并不可靠。JavaScript 提供的另一种机制——Cookie,则能够满足真正的全局变量需求。
Cookie 是浏览器提供的一种机制,它将 document 对象的 cookie 属性暴露给 JavaScript 进行控制,这并非 JavaScript 语言本身的固有特性。Cookie 实际存储于用户硬盘的一个文件中,该文件通常与特定域名相关联。当浏览器再次访问该域名时,便会读取并使用这个 Cookie。因此,Cookie 可以在同一个域名下的多个网页间共享,但无法跨越不同的域名使用。
尽管不同浏览器对 Cookie 的实现方式各异,但其本质性质相同。例如,在 Windows 2000 及 Windows XP 系统中,Cookie 文件存储于 documents and settings\userName\cookie\ 文件夹下。其命名格式通常为:userName@domain.txt。
Cookie 机制将信息存储于用户硬盘,因此可作为全局变量使用,这是其最大优势。它主要适用于以下几种场景。
保存用户登录状态。例如,将用户 ID 存储于一个 Cookie 内,这样当用户下次访问该页面时便无需重新登录,目前许多论坛和社区均提供此类功能。Cookie 还可设置过期时间,超过期限后 Cookie 将自动失效。因此,系统通常会提示用户选择保持登录状态的时间,常见选项包括一个月、三个月或一年等。
跟踪用户行为。例如,一个天气预报网站可根据用户选择的地区显示当地天气。若每次访问都需重新选择所在地则显得繁琐,利用 Cookie 后体验将更为人性化:系统能记住上一次访问的地区,当下次打开页面时,自动显示上次用户所在地区的天气情况。由于这一切均在后台完成,此类页面仿佛为特定用户定制,使用极为便捷。
定制页面。若网站提供换肤或更换布局功能,可使用 Cookie 记录用户选项,例如背景色、分辨率等。当用户下次访问时,仍可保留上一次访问的界面风格。
创建购物车。正如前例中使用 Cookie 记录用户需购买的商品一样,在结账时可统一提交。例如,淘宝网使用 Cookie 记录用户曾经浏览过的商品,方便随时进行比较。
当然,上述应用仅是 Cookie 能完成的部分功能,还有更多需要全局变量的场景。Cookie 的缺点主要集中在安全性和隐私保护方面,主要包括以下几种情况。
Cookie 可能被禁用。当用户高度重视个人隐私保护时,他们很可能禁用浏览器的 Cookie 功能;
Cookie 是与浏览器相关的。这意味着即使访问的是同一个页面,不同浏览器之间所保存的 Cookie 也是无法互相访问的;
Cookie 可能被删除。因为每个 Cookie 都是硬盘上的一个文件,因此很有可能被用户手动删除;
Cookie 安全性不够高。所有的 Cookie 均以纯文本形式记录于文件中,因此若要保存用户名、密码等信息,最好事先经过加密处理。
Cookie 的设置与管理
设置 Cookie
每个 Cookie 都是一个名/值对,可以将如下字符串赋值给 document.cookie:
document.cookie="userId=828";
若要一次存储多个名/值对,可以使用分号加空格(; )进行分隔,例如:
document.cookie="userId=828; userName=hulk";
在 Cookie 的名或值中不能使用分号(;)、逗号(,)、等号(=)以及空格。在 Cookie 的名中做到这点很容易,但要保存的值往往是不确定的。如何存储这些值呢?方法是用 escape() 函数进行编码,它能将一些特殊符号使用十六进制表示,例如空格将会编码为“20%”,从而可以存储于 Cookie 值中,而且使用此种方案还可以避免中文乱码的出现。例如:
document.cookie="str="+escape("I love ajax");
相当于:
document.cookie="str=I%20love%20ajax";
当使用 escape() 编码后,在取出值以后需要使用 unescape() 进行解码才能得到原来的 Cookie 值,这在前面已经介绍过。
尽管 document.cookie 看上去就像一个属性,可以赋不同的值。但它和一般的属性不一样,改变它的赋值并不意味着丢失原来的值,例如连续执行下面两条语句:
document.cookie="userId=828";
document.cookie="userName=hulk";
这时浏览器将维护两个 Cookie,分别是 userId 和 userName,因此给 document.cookie 赋值更像执行类似这样的语句:
document.addCookie("userId=828");
document.addCookie("userName=hulk");
事实上,浏览器就是按照这样的方式来设置 Cookie 的,如果要改变一个 Cookie 的值,只需重新赋值,例如:
document.cookie="userId=929";
这样就将名为 userId 的 Cookie 值设置为了 929。
Cookie 值的读取与解析
获取 Cookie 的值
下面介绍如何获取 Cookie 的值。Cookie 的值可以由 document.cookie 直接获得:
var strCookie=document.cookie;
这将获得以分号隔开的多个名/值对所组成的字符串,这些名/值对包括了该域名下的所有 Cookie。例如:
<script language="JavaScript" type="text/javascript">
<!--
document.cookie="userId=828";
document.cookie="userName=hulk";
var strCookie=document.cookie;
alert(strCookie);
//-->
</script>
图 7.1 显示了输出的 Cookie 值。由此可见,只能够一次获取所有的 Cookie 值,而不能指定 Cookie 名称来获得指定的值,这正是处理 Cookie 值最麻烦的一部分。用户必须自己分析这个字符串,来获取指定的 Cookie 值,例如,要获取 userId 的值,可以这样实现:
<script language="JavaScript" type="text/javascript">
<!--
//设置两个 Cookie
document.cookie="userId=828";
document.cookie="userName=hulk";
//获取 Cookie 字符串
var strCookie=document.cookie;
//将多 Cookie 切割为多个名/值对
var arrCookie=strCookie.split("; ");
var userId;
//遍历 Cookie 数组,处理每个 Cookie 对
for(var i=0;i<arrCookie.length;i++){
var arr=arrCookie[i].split("=");
//找到名称为 userId 的 Cookie,并返回它的值
if("userId"==arr[0]){
userId=arr[1];
break;
}
}
alert(userId);
//-->
</script>
这样就得到了单个 Cookie 的值
用类似的方法,可以获取一个或多个 Cookie 的值,其主要的技巧仍然是字符串和数组的相关操作。
Cookie 过期时间与删除
给 Cookie 设置终止日期
到现在为止,所有的 Cookie 都是单会话 Cookie,即浏览器关闭后这些 Cookie 将会丢失,事实上这些 Cookie 仅仅是存储在内存中,而没有建立相应的硬盘文件。
在实际开发中,Cookie 常常需要长期保存,例如保存用户登录的状态。这可以用下面的选项来实现:
document.cookie="userId=828; expires=GMT_String";
其中 GMT_String 是以 GMT 格式表示的时间字符串,这条语句就是将 userId 这个 Cookie 设置为 GMT_String 表示的过期时间,超过这个时间,Cookie 将消失,不可访问。例如:如果要将 Cookie 设置为 10 天后过期,可以这样实现:
<script language="JavaScript" type="text/javascript">
<!--
//获取当前时间
var date=new Date();
var expireDays=10;
//将 date 设置为 10 天以后的时间
date.setTime(date.getTime()+expireDays*24*3600*1000);
//将 userId 和 userName 两个 Cookie 设置为 10 天后过期
document.cookie="userId=828; userName=hulk; expire="+date.toGMTString();
//-->
</script>
删除 Cookie
为了删除一个 Cookie,可以将其过期时间设定为一个过去的时间,例如:
<script language="JavaScript" type="text/javascript">
<!--
//获取当前时间
var date=new Date();
//将 date 设置为过去的时间
date.setTime(date.getTime()-10000);
//将 userId 这个 Cookie 删除
document.cookie="userId=828; expire="+date.toGMTString();
//-->
</script>
Cookie 路径与域名控制
指定可访问 Cookie 的路径
默认情况下,如果在某个页面创建了一个 Cookie,那么该页面所在目录中的其他页面也可以访问该 Cookie。如果这个目录下还有子目录,则在子目录中也可以访问。例如在 www.xxxx.com/html/a.html 中所创建的 Cookie,可以被 www.xxxx.com/html/b.html 或 www.xxx.com/ html/ some/c.html 所访问,但不能被 www.xxxx.com/d.html 访问。
为了控制 Cookie 可以访问的目录,需要使用 path 参数设置 Cookie,语法如下:
document.cookie="name=value; path=cookieDir";
其中 cookieDir 表示可访问 Cookie 的目录。例如:
document.cookie="userId=320; path=/shop";
就表示当前 Cookie 仅能在 shop 目录下使用。
如果要使 Cookie 在整个网站下可用,可以将 cookie_dir 指定为根目录,例如:
document.cookie="userId=320; path=/";
指定可访问 Cookie 的主机名
和路径类似,主机名是指同一个域下的不同主机,例如:www.google.com 和 gmail.google.com 就是两个不同的主机名。默认情况下,一个主机中创建的 Cookie 在另一个主机下是不能被访问的,但可以通过 domain 参数来实现对其的控制,其语法格式为:
document.cookie="name=value; domain=cookieDomain";
以 google 为例,要实现跨主机访问,可以写为:
document.cookie="name=value;domain=.google.com";
这样,所有 google.com 下的主机都可以访问该 Cookie。
通用 Cookie 处理函数封装
综合示例:构造通用的 Cookie 处理函数
Cookie 的处理过程比较复杂,并具有一定的相似性。因此可以定义几个函数来完成 Cookie 的通用操作,从而实现代码的复用。下面列出了常用的 Cookie 操作及其函数实现。
1.添加一个 Cookie:addCookie(name,value,expireHours)
该函数接收 3 个参数:Cookie 名称,Cookie 值,以及在多少小时后过期。这里约定 expireHours 为 0 时不设定过期时间,即当浏览器关闭时 Cookie 自动消失。该函数实现如下:
<script language="JavaScript" type="text/javascript">
<!--
function addCookie(name,value,expireHours){
var cookieString=name+"="+escape(value);
//判断是否设置过期时间
if(expireHours>0){
var date=new Date();
date.setTime(date.getTime+expireHours*3600*1000);
cookieString=cookieString+"; expire="+date.toGMTString();
}
document.cookie=cookieString;
}
//-->
</script>
2.获取指定名称的 Cookie 值:getCookie(name)
该函数返回名称为 name 的 Cookie 值,如果不存在则返回空,其实现如下:
<script language="JavaScript" type="text/javascript">
<!--
function getCookie(name){
var strCookie=document.cookie;
var arrCookie=strCookie.split("; ");
for(var i=0;i<arrCookie.length;i++){
var arr=arrCookie[i].split("=");
if(arr[0]==name)return arr[1];
}
return "";
}
//-->
</script>
3.删除指定名称的 Cookie:deleteCookie(name)
该函数可以删除指定名称的 Cookie,其实现如下:
<script language="JavaScript" type="text/javascript">
<!--
function deleteCookie(name){
var date=new Date();
date.setTime(date.getTime()-10000);
document.cookie=name+"=v; expire="+date.toGMTString();
}
//-->
</script>
JS处理含Emoji或中文的字符串转数组乱码问题
2026-11-05 16:12:28
JS怎么使用展开运算符合并对象
2026-11-05 14:42:18
ES6+环境下判断JS对象为空的简洁写法
2026-11-05 12:12:23
怎么通过replacer函数自定义JS中JSON的格式化输出
2026-11-05 11:19:44
JS正则表达式基础:字面量与RegExp构造函数的区别及常用元字符
2026-11-05 11:16:58
