js操作cookie:设置、读取、删除

本文详细解释了Cookie的概念、特点及使用方法,包括Cookie的工作原理、注意事项、如何设置和获取Cookie、修改Cookie以及如何清除Cookie,并特别指出Chrome在本地文件测试下对Cookie的支持问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【什么是cookie】
“cookie 是存储于访问者的计算机中的变量。每当同一台计算机通过浏览器请求某个页面时,就会发送这个 cookie。你可以使用 JavaScript 来创建和取回 cookie 的值。”
不同的浏览器可能对cookie的储存方式不同,但是相同的是cookie中的内容都是保存在客户一端的。(session是保存在服务器上的)

【cookie的几点注意】
说的通俗一点,cookie就是一个字符串(这点可以用alert(typeof document.cookie)来验证),用来保存一些客户信息。
程序员可以对其写入任何想写入的东西,只要不超过cookie的大小限制(4kb)。
cookie的操作办法最简单的说法就是对document.cookie进行操作(写入你要需保存的内容)。
cookie有一个关键字是expires,它是用来设置cookie的有效期的,默认情况(不设置expires)是当浏览器关闭的时候,自动清除cookie。
一般来说,cookie的形式都是这样的:"cookieName1=cookie1;cookieName2=cookie2;expires=" + date,这里需要注意几点:

1.注意分号
";expires="之前的字符串你可以随便写,但是";expires="必须遵循这个写法,尤其是这个分号不能少,不然浏览器是认不出你的expires(过期时间),而把它当成cookie内容的一部分。
例如:
如果你写成

<html>
<head>
<script type="text/javascript">
var date = new Date();
date.setDate(date.getDate() + 10);  //date设置为十天之后
document.cookie = "username=findingsea^password=123^expires=" + date.toGMTString();  //toGMTString方法将date转换成格林威治标准时间的字符串
</script>
</head>
<body>
</body>
</html>

打开firefox下的选项-->隐私-->删除私人Cookie

可以到cookie过期的时间为当前会话结束时,也就是浏览器关闭的时候。换而言之,就是我们设置的expires完全没有起作用。
要fix也很容易,只要在上段代码中,在expires前加一个分号,也就是改成"...^;expires=",重新运行firefox查看cookie

可以看到过期时间为10之后(今天是2012年8月31日),expires设置成功,所以说分号很重要,很重要!!!

2.如何清除cookie
其实清除cookie这种说法是不准确的,应该是说让cookie过期。因为不能直接对cookie置空,(如果以为document.cookie="",这样就能清空cookie,我只能说少年你还是太天真了),而使cookie的方法也很简单,就是设置expires。我们可以把expires设置到很久以后,让cookie能长期保存,那同样我们也能把cookie设置到过去,让cookie马上过期。这个“过去”就是1970年1月1号,我们将expires设置到这个时间,cookie就过期了。也可以设置为早于当前时间的任意时间。

3.如何设置和获取cookie
<在一条cookie中设置多个变量>
JavaScript没有提供根据cookie名来获取cookie值的方法。上面已经讲过了,document.cookie只是一个字符串而已,我们就对其进行字符串解析即可。要在获取的时候进行解析,就要需要在设置的时候设置标识符,这里需要注意的点和第一点刚好相反,在第一点中,我们是千叮咛万嘱咐不要忘记分号,而且在设置标识符的时候,我建议尽量不要用分号当做分隔符,我们来看一下对比;
代码1:

<html>
<head>
<script type="text/javascript">
var date = new Date();
date.setDate(date.getDate() + 10);
document.cookie = "username=findingsea;password=123;expires=" + date.toGMTString();
</script>
</head>
<body> 
</body>
</html>


效果:

代码2:

<html>
<head>
<script type="text/javascript">
var date = new Date();
date.setDate(date.getDate() + 10);
document.cookie = "username=findingsea^password=123^;expires=" + date.toGMTString();
</script>
</head>
<body> 
</body>
</html>


效果:

可以很清楚地看到,代码1中的password=123都“吞掉了”,造成这个现象的原因是,浏览器在保存cookie的时候,在读到分号之后,就认为cookie的内容结束了,浏览器理想的cookie形式是"cookieName=cookie;expires=date",但是显然我们并不满足这样,所以要在一条cookie中设置多个值,就需要像代码2这样用标示符(不要分号)进行分割。然后在读取的时候,也根据标示符进行逐个读取。
<设置多个cookie>
当然当然当然,以上是正对相对复杂的需要我们在同一条cookie中设置多个变量的情况,更规范的情况是一条cookie就储存一个对象。不过这样的话,你的cookie就要占用更多的空间(相比于一条cookie中设置多个变量而已,因为你需要为每个cookie都设置一个expires)。不过这样的操作更加简单和规范,推荐在变量少的情况下使用。
代码如下:

<html>
<head>
<script type="text/javascript">
var date = new Date();
date.setDate(date.getDate() + 10);
document.cookie = "username=findingsea;expires=" + date.toGMTString();
document.cookie = "password=123;expires=" + date.toGMTString();
alert(document.cookie)
</script>
</head>
<body> 
</body>
</html>

效果:

那这时候document.cookie里的值是多少?让我们alert一下:

这个时候,你再去解析cookie的时候,就要用分号作为分隔符了。

4.如何修改cookie
document.cookie虽然是一个字符串,但是当你对它的内容进行修改的时候,浏览器先进行解析和查询,而不是直接的覆盖和修改。如果你要修改的cookie已经存在,那浏览器就对已存在的那个cookie进行修改,否则,浏览器会按照你的cookie名和cookie值新建一个cookie。
代码:

<html>
<head>
<script type="text/javascript">
var date = new Date();
date.setDate(date.getDate() + 10);
document.cookie = "username=findingsea;expires=" + date.toGMTString();
document.cookie = "username=ly;expires=" + date.toGMTString();
document.cookie = "password=123;expires=" + date.toGMTString();
alert(document.cookie)
</script>
</head>
<body> 
</body>
</html>

效果:

可以看到当遇到之间已经定义过的cookie(username),浏览器会自己修改原来储存的值,而如果该cookie之间没有定义过(password),浏览器则会创建一个新的cookie。

5.chrome在file:///测试下不支持本地cookie
就好比我写个html文件放在本地,里面有创建cookie的代码,直接用chrome打开这个本地的html文件,创建cookie的代码是不会执行成功的,因为chrome阻止了对document.cookie的赋值。想要解决这个问题也很简单,把代码部署到服务器进行测试,创建cookie的js代码就能正常执行了。

【talk is cheap, show me the code.】


OK,上code!

<!doctype html>
<html>
<head>
<title>记住密码</title>
<meta http-equiv='content-type' content='text/html;charset=utf-8;' />
<script type="text/javascript"> 
//根据分隔符每个变量的值
function getCookie(c_name){
    if (document.cookie.length > 0) {
        c_start = document.cookie.indexOf(c_name + "=")
        if (c_start != -1) { 
            c_start = c_start + c_name.length + 1;
            c_end = document.cookie.indexOf("^",c_start);
            if (c_end==-1) c_end=document.cookie.length;
            return unescape(document.cookie.substring(c_start,c_end));
        } 
    }
    return "";
}
 
//设置cookie
function setCookie(c_name, n_value, p_name, p_value, expiredays){
    var exdate = new Date();
    exdate.setDate(exdate.getDate() + expiredays);
    document.cookie = c_name + "=" + escape(n_value) + "^" + p_name + "=" + escape(p_value) + ((expiredays == null) ? "" : ";expires=" + exdate.toGMTString()) + ';path=/';
    console.log(document.cookie)
}


//检测cookie是否存在,如果存在则直接读取,否则创建新的cookie
function checkCookie(){
    alert(document.cookie)
    var username = getCookie('username');
    var password = getCookie('password');
    if (username != null && username != "" && password != null && password != "") {
        alert('Your name: ' + username + '\n' + 'Your password: ' + password);
    }else {
        username = prompt('Please enter your name:',"");
        password = prompt('Please enter your name:',"");
        if (username != null && username != "" && password != null && password != ""){
            setCookie('username', username, 'password', password, 365);
        }
    }
    alert(document.cookie)



//使cookie过期
function cleanCookie (c_name, p_name) { 
    setCookie(c_name,'',p_name,'',-1);
}
</script>
</head> 
<body onLoad="checkCookie()">
</body>
</html>
注意:这里面的js加密函数 escape()对普通字母、数字不进行加密,只对空格、标点、重音符号以及其他非ASC2字符用%xx 编码代替,推荐使用别的加密算法,可以参考我另一篇博客:http://blog.youkuaiyun.com/inuyasha1121/article/details/51134464
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值