Fork me on GitHub

Cookie概念及封装和优化

cookie概念

为什么会有cookie?

  • web应用程序之间的交互是需要遵循 http协议(即超文本传输协议) 的,而http协议是无状态的,即链接之后就会断开,而且不会记录用户信息。
  • 此时cookie便应运而生,常见当我们登录一个网站时,如果点击了记住密码和账号,那么下次再打开网站便可以直接登入。

cookie特点

  • cookie是存在于浏览器下的,以字符串的形式(key=value)存储数据,每一个 key=value 就是一条数据,多个数据之间以分号(;)分割
  • 有过期时间,一般是会话级别(也就是浏览器关闭就过期了),也可以手动设置过期时间
  • 存储大小有限制,一般是 4 KB 左右
  • 数量有限制,一般是 50 条左右
  • 有域名限制,也就是说谁设置的谁才能读取
  • 请求中自动携带。只要 cookie 里面有东西, 就会在发送请求的时候自动携带

cookie的使用

Google chrome浏览器可在在控制台的Application下查看cookie
一条cookie信息包括:
  • name:一个cookie的名称
  • value:一个cookie的值
  • domain:为可以访问此cookie的域名
  • path:为可以访问此cookie的页面路径
  • expires/Max-Age :为此cookie生效期。不设置的话默认值是Session级别
  • size:此cookie大小
  • http:cookie的httponly属性。若此属性为true,则只有在http请求头中会带有此cookie的信息,而不能通过document.cookie来访问此cookie
  • secure:设置是否只能通过https来传递此条cookie

cookie操作

  • 读取cookie的内容
var cookie = document.cookie;
console.log(cookie) // 就能得到当前 cookie 的值
  • 设置 cookie 的内容
// 设置一个时效性为会话级别的 cookie
document.cookie = 'a=100'
// 设置一个有过期时间的 cookie
// 这个 cookie 数据会在 2043 年 12 月 18 日 12 点以后过期,过期后会自动消失
document.cookie = 'b=200;expires=Thu, 18 Dec 2043 12:00:00 GMT";'
  • 删除 cookie 的内容
// 因为 cookie 不能直接删除
// 所以只能把某一条 cookie 的过期时间设置成当前时间之前
// 那么浏览器就会自动删除 cookie
document.cookie = 'b=200;expires=Thu, 18 Dec 2018 12:00:00 GMT";'

cookie操作封装

1、获取cookie

// 获取一条cookie,只需要name 即可,返回相应的value
function getCookie(name){
	var cookie_str = document.cookie;
	var cookie_arr = cookie_str.split("; ");
	var value_res = "";
	for(var i = 0; i < cookie_arr.length; i ++){
		if (cookie_arr[i].split("=")[0] === name) {
			value_res = cookie_arr[i].split("=")[1];
		}
	}
	return value_res;
}

2、设置cookie

// name value 为必选设置参数项,options为可选设置参数项
function setCookie(name, value, options){
	// 判断是否是对象
    function isObject( obj ){
    	return (typeof obj === "object" && obj !== null && obj.constructor && obj.constructor === Object)
    }
	if (!isObject(options)) {
		options = {};
	}
	if (typeof options.expires === "number") {
		var d = new Date();
		d.setDate(d.getDate() + options.expires);
	}
	return (document.cookie = [
		name + "=" + value,
		typeof options.expires === "number" ? ";expires=" + d : "",
		typeof options.domain === "string" ? ";domain=" + options.domain : "",
		typeof options.path === "string" ? ";path=" + options.path : "",
	].join(""));
}

3、删除cookie

function removeCookie(name, options){
	// 支持两种传参方式:("name", {path : "/"}) 或 ("name", "/")
	// 为什么要合并对象,因为要向对象之中加入数据 以达到删除 cookie 的功能
	setCookie(name, "", isObject(options) ? assign(options, {expires : -1}) : {path : options, expires : -1});
	// 对象合并;
    function assign(){
       var target = arguments[0];
       for(var i = 1 ; i < arguments.length ; i ++){
           for(var attr in arguments[i]){
               target[attr] = arguments[i][attr];
           }
       }
       return target;
    }
}

4、封装优化

合并【设置cookie封装函数】和【获取cookie封装函数】

function cookie(name, value, options){
	// 如果参数大于一个,并且value是一个字符串。那么认为是在设置 cookie
	if ( arguments.length > 1 && typeof value === "string" ) {
		// 设置 cookie
		if(!isObject( options )){
			options = {};
		}
		if( typeof options.expires === "number"){
			var d = new Date();
			d.setDate( d.getDate() + options.expires );
		}
		return (document.cookie = [
				name + "=" + value,
				typeof options.expires === "number" ? ";expires=" + d : "",
				typeof options.domain === "string" ? ";domain=" + options.domain : "",
				typeof options.path === "string" ? ";path=" + options.path : "",
		].join(""));
	}
	// 只有一个参数,则是 查询 cookie
	var cookie_str = document.cookie;
	var cookie_arr = cookie_str.split("; ");
	var value_res = "";
	cookie_arr.forEach(function(item){
		if (item.split("=")[0] === name) {
			value_res = item.split("=")[1];
		}
	});
	return value_res;
}
posted @ 2020-03-29 13:38  远行行  阅读(120)  评论(0编辑  收藏  举报