JavaScript 删除cookie

8,049 阅读2分钟

创建cookie之后,可能出于各种原因需要将其删除。

网络上提供有很多封装好的删除代码,但是绝大多数忽略了一个问题。

从而导致代码有时候好用,有时则不能删除指定cookie,下面将详细介绍一下如何删除cookie。

后面文章会涉及到一些概念,这里提前给出参考文章:

(1).path与domain参阅cookie path路径与domain域一章节。

(2). Secure与HttpOnly参阅cookie Secure与HttpOnly一章节。

一.删除cookie的方式:

(1).没有显式设置cookie过期时间:

如果没有显示设置cooke过期时间,cookie不会存入本地硬盘,仅存留于内存中。

当我们关闭浏览器的时候,cookie会自动删除,生命周期无需我们操控。

(2).显式设置cookie过期时间:

更多的时候,cookie的生命周期可能需要人为的设置,以达到某些需求。

比如用户名与密码保存一天、一周或者一月等设置,通过Expires属性即可实现。

当当前时间日期超过Expires属性值时,cookie就会被自动删除。

关于过期时间可以参阅JavaScript 设置cookie 过期时间一章节。

二.封装删除:

JavaScript并没有内置接口直接删除cookie,但是可以利用过期时间实现删除功能。

代码实例如下:

//取cookies     
function getCookie(name){
  let arr = document.cookie.match(new RegExp("(^| )" + name + "=([^;]*)(;|$)"));
  if (arr != null) return unescape(arr[2]); 
  return null;
}
//删除cookie
function delCookie(name){
  var exp = new Date();
  exp.setTime(exp.getTime() - 1);
  var cval = getCookie(name);
  if (cval != null) document.cookie = name + "=" + cval + ";expires=" + exp.toGMTString();
}

上面代码可以实现删除指定名称cookie的功能,比较常用,且网上代码绝大多数都是如此,本文作者曾经也对此深信不疑,因为它的确能够删除指定的cookie,但是上述代码有缺陷,有时会不能够删除指定名称的功能,下面做一下演示。

通过控制台下添加如下cookie:

document.cookie="name=小逗号;path=/"

效果如下:

下面进行删除操作:

可以看到名称为name的cooki并没有被删除,没删除就对了,因为上面的函数封装没有考虑周全。

cookie的修改需要遵循一个原则,那么就是cookie的如下四个属性必须匹配:

(1).key

(2).domain

(3).path

(4).secure

当我们在设置cookie的时候显式设置path为根目录/,但是在删除的时候没有规定路径,所以删除失败。

删除cookie就是对cookie的过期时间的修改,所以也要遵循上述原则,代码修改如下:

//取cookies     
function getCookie(name){
  let arr = document.cookie.match(new RegExp("(^| )" + name + "=([^;]*)(;|$)"));
  if (arr != null) return unescape(arr[2]); 
  return null;
}
//删除cookie
function delCookie(name){
  var exp = new Date();
  exp.setTime(exp.getTime() - 1);
  var cval = getCookie(name);
  if (cval != null) 
    document.cookie = name + "=" + cval + ";expires=" + exp.toGMTString()+";path=/";
}
delCookie("name");
document.cookie;

运行效果如下:

可以看到名称为aname的cookie成功被删除。

所以这一点要特别的主意,因为如果对cookie掌握的不是太全面可能就会导致无法删除指定cookie得现象。

且查错比较困难,上述代码没有进行封装,只是演示了删除cookie的注意点。