JavaScript中的cookie

对于一个码农来说,cookie可能是很常用的一个技术点,今天说一下对前端(JavaScript)中的cookie理解和使用心得。

在学习这个知识点前,先将它分为以下几个小节:

  1. 什么是cookie,cookie的作用
  2. cookie的工作机制,运作流程
  3. cookie属性项
  4. cookie的作用域
1.什么是cookie?

简单来说,cookie是一个存放数据的东西,存储量4kb,在有效期内存放在客户端上和应用设备上。

举个:你去银行办一张信用卡,需要身份证,密码,手机号等个人信息,格式如下:身份证号:xxxx,密码:xxxx,手机号:xxxx, 这些信息等同与cookie中(key:value)名/值对形式存储在客户端上 而存储在你的银行卡中,你办理的卡片有效期等同于cookie中的expires字段。你办理的银联卡,visa,万事通等卡片属性等同于cookie的作用域,下次用卡的时候,机器从你卡中就能识别你的卡,从而直接办理各种业务。

2.cookie的工作机制,运作流程JavaScript中的cookie_第1张图片

客户端发送一个请求到服务器 → 服务器发送一个HttpResponse响应到客户端,其中包含Set-Cookie的头部 → 客户端保存cookie,之后向服务器发送请求时,HttpRequest请求中会包含一个Cookie的头部 → 服务器返回响应数据

3.cookie属性项

属性 介绍
name=value 键值对,可以设置要保存的key/value,注意这里的name不能和其他属性项的名字相同
Expires 过期时间,在设置的某个时间点后,该cookie就会失效
Domain 生成该cookie的域名,如domain=“www.zhihu.com”
Path 告诉浏览器 cookie 的路径。默认情况下,cookie 属于当前页面。
上点代码

创建一个可在 cookie 变量中存储访问者姓名的函数setCookies

// 这个函数中的参数存有 cookie 的名称、值以及过期天数。
// 在函数中,我们首先将天数转换为有效的日期,然后,我们将 cookie 名称、值及其过期日期存入 document.cookie 对象。
function setCookies(c_name, value, expiredays) {
    var exdate = new Date();
    exdate.setDate(exdate.getDate() + expiredays)
    document.cookie = c_name + "=" + escape(value) + ((expiredays == null) ? "" : ";expires=" + exdate
    .toGMTString()) + "path=/" + "httponly";
    var x = document.cookie;
    console.log(x + "----------")
    console.log(exdate + "----------")
}

之后,我们要创建另一个函数来检查是否已设置 cookie:

//首先检查 document.cookie 对象中是否存有 cookie。假如 document.cookie 对象存有某些 cookie,那么会继续检查我们指定的 cookie 是否已储存。如果找到了我们要的 cookie,就返回值,否则返回空字符串。
function getCookie(c_name){
	if(document.cookie.length > 0){
	  let 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
	      console.log(document.cookie.substring(c_start,c_end))
	      return unescape(document.cookie.substring("cookie:"+c_start,c_end))
	    }
	  }
	}
	console.log("没有设置cookie")
	return ""
}

最后,我们要创建一个函数,这个函数的作用是:如果 cookie 已设置,则显示欢迎词,否则显示提示框来要求用户输入名字。

//如果 cookie 已设置,则显示欢迎词,否则显示提示框来要求用户输入名字
function checkCookie(){
   username = getCookie("username");
   if(username != "" && username != null ) {
     alert("欢迎回来," + username + "!")
   } else {
     username = prompt("请填写你的名字:","")
     if(username != null && username !=""){
       setCookies("username", username, 365)
     }
   }
}

4.cookie的作用域

cookie对象的domain属性设置了cookie的作用域。domain本身以及domain的子域名可以访问到相关cookie。

在对cookie的domain进行设置时,不能讲domain指定为除当前域名或者其父域名之外的其他域名,即cookie无法跨域设置。这句话是什么意思呢?下面来看几个实验。

现在有如下3个域名,一个顶级域名、一个二级域名和一个三级域名:

① zydya.com
②blog.zyday.com
③one.blog.zyday.com

1、首先在①zyday.com域名下设置cookie,做四次测试,分别设置domain参数为空、’zyday.com’、’blog.zyday.com’ 与 ‘one.blog.zyday.com’。
√表示该域名下能取到cookie,×表示不能取到cookie

domain参数 zydya.com blog.zyday.com one.blog.zyday.com
setcookie(‘name’,1,time()+1)
setcookie(‘name’,1,time()+1,’/’,’zyday.com’)
setcookie(‘name’,1,time()+1,’/’,’blog.zyday.com’) × × ×
setcookie(‘name’,1,time()+1,’/’,’one.blog.zyday.com’) × × ×

当domain设置为空时,domain默认为当前域名,并且该域名下的子域名都可以接收到cookie。
但是domain参数设置其子域名时,所有域名就接收不到了,包括那个子域名。

2、在②blog.zyday.com域名下设置cookie,测试条件同上

domain参数 zydya.com blog.zyday.com one.blog.zyday.com
setcookie(‘name’,1,time()+1) ×
setcookie(‘name’,1,time()+1,’/’,’zyday.com’)
setcookie(‘name’,1,time()+1,’/’,’blog.zyday.com’) ×
setcookie(‘name’,1,time()+1,’/’,one.blog.zyday.com’) × × ×

看第二行,domain参数是zyday.com,是blog.zyday.com的父域名,那么zyday.com下所有子域名(包括zyday.com、blog.zyday.com、one.blog.zyday.com)都能接收到cookie。
当domain为自身域名时,那么其父域名受影响,其本身与其子域名可以接收到cookie。
而设置其子域名或其他域名时,所有域名都接收不到cookie了。

3、在③one.blog.zyday.com域名下设置cookie

domain参数 zydya.com blog.zyday.com one.blog.zyday.com
setcookie(‘name’,1,time()+1) × ×
setcookie(‘name’,1,time()+1,’/’,’zyday.com’)
setcookie(‘name’,1,time()+1,’/’,’blog.zyday.com’) ×
setcookie(‘name’,1,time()+1,’/’,one.blog.zyday.com’) × ×

同理。

由此可以得出结论,domain的设置,有两点要注意:

1.在setcookie中省略domain参数,那么domain默认为当前域名。

2.domain参数可以设置父域名以及自身,但不能设置其它域名,包括子域名,否则cookie不起作用。

另外,一个有效的cookie的作用域为: domain本身以及domain下的所有子域名。

今天就写到这里^ _ ^

你可能感兴趣的:(js,js技术栈,js,javascript,html,cookie)