Cookie增删改查方法封装(低内存开销版)

news2024/9/21 12:24:52

本文章中的低内存开销是指在获取cookie的时候不进行字符串—>数组的转变,全程使用slice+indexOf切割字符串,不创建和操作数组,节约内存,本文代码已存放到github中,后续会持续完善功能,传送门:https://github.com/Escaay/cookieHandler.git
本文由Escaay原创,转载请注明出处

一、前置知识

0.测试cookie,需要服务器环境,想要在本地完成,需要模拟服务器环境,最快的方法是在vscode扩展中下载Live Server

在这里插入图片描述

然后重启vscode,右键点击图示即可在服务器环境运行代码

在这里插入图片描述

1.cookie是挂在ducument上的,document是一个HTML标签的DOM经过特殊加工的对象,所以我们获取cookie,一般是

let cookie=document.cookie

2.添加cookie,每一次设置document.cookie都会添加cookie,而不是给cookie重新赋值,而且会自动在每个分号之后添加一个空格,例如

document.cookie='username=escaay'
document.cookie='username=xiaoming'
console.log(document.cookie)	
//'username=escaay; username=xiaoming'

3.cookie的value中不能含有;=等特殊字符,如果需要,则借助encodeURIComponent()进行编码后再赋值,取出时用decodeURIComponent解码

let value=;escaay//;是特殊字符
document.cookie=`name=username;value=${encodeURIComponent(value)}`

二、cookie增删改查方法封装

1.添加一个cookie

function setCookie(name, value, maxAge) {
            let cookie = `${name}=${encodeURIComponent(value)}`
            //判断传入过期时间类型,是数字的话就添加到cookie
            if (typeof maxAge==='number') {
                cookie += `;max-age=${maxAge}`
            }
            document.cookie = cookie
        }

2.获取整个对象类型的cookie

function getCookieObject() {
			//cookie为空返回null
            if(!document.cookie.length) return 'cookie为空'
            let result = {}
            //将添加cookie时自动生成的空格去掉,避免后面索引对不上
            let cookieStr = document.cookie.replace(/; /g, ';')
            //为cookie最后添加分号,这样一会循环才能遍历最后一项
            if (cookieStr.slice(-1) !== ';') cookieStr += ';'
            //滑动选取每一项cookie元素
            let startIndex = 0
            let nextStartIndex = 0
            //等号的索引
            let equalIndex = 0
            //当startIndex之后不再有分号时,已经遍历每一项cookie元素
            while (cookieStr.indexOf(';', startIndex) !== -1) {
                equalIndex = cookieStr.indexOf('=', startIndex)
                nextStartIndex = cookieStr.indexOf(';', startIndex) + 1
                let key = cookieStr.slice(startIndex, equalIndex)
                let value = decodeURIComponent(cookieStr.slice(equalIndex + 1, nextStartIndex-1))
                result[key] = value
                startIndex = nextStartIndex
            }
            return result
        }

3.根据名称获取单个cookie的值

function getCookie(name) {
			//未传参则退出函数
            if(!name)  return 'cookie中不存在此键'
            let cookieStr = document.cookie
            if (cookieStr.slice(-1) !== ';') cookieStr += ';'
            let startIndex=cookieStr.indexOf(`${name}=`)
            if(startIndex===-1) return 'cookie中不存在此键'
            startIndex+=name.length+1
            let endIndex=cookieStr.indexOf(';',startIndex)
            return decodeURIComponent(cookieStr.slice(startIndex,endIndex))
        }
}

4.根据名称删除单个cookie

function deleteCookie(name){
            setCookie(name,'',0)
            console.log(`cookie中${name}删除成功`)
        }

5.清除cookie

function clearCookie(){
            let cookieObj=getCookieObject()
            Object.keys(cookieObj).forEach((v,i)=>{
                deleteCookie(v)
            })
            console.log('cookie清除成功')
        }

测试代码

        //test
        setCookie('username', 'escaay;;;')
        setCookie('phone', '88888')
        console.log('getCookieObject:  ',getCookieObject())
        console.log("getCookie('username'):  ",getCookie('username'))
        deleteCookie('username')
        console.log('getCookieObject:  ',getCookieObject())
        console.log("getCookie('username'):  ",getCookie('username'))
        clearCookie()
        console.log('getCookieObject:  ',getCookieObject())

测试结果
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/659768.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

二进制方式部署kubernetes集群

二进制方式部署kubernetes集群 1、部署k8s常见的几种方式 1.1 kubeadm Kubeadm 是一个 k8s 部署工具,提供 kubeadm init 和 kubeadm join,用于快速部署 Kubernetes 集群。 Kubeadm 降低部署门槛,但屏蔽了很多细节,遇到问题很难…

掌握Python的X篇_4_开发工具ipython与vscode的安装使用

本篇将会介绍两个工具的安装及使用来提高Python的编程效率。 ipython:比python更好用的交互式开发环境vscode:本身是文本编辑器,通过安装相关的插件vscode可以作为python集中开发环境使用 掌握Python的X篇_4_开发工具ipython与vscode的安装使…

第四章 linux编辑器——vim的使用

第四章 linux编辑器——vim的使用 一、什么是vim?二、vim的基本操作1、模式之间的相互切换2、vim的常见命令集(1)正常模式的常见命令a. 模式切换b. 光标移动c.删除文字d.复制e.替换f.撤销g.更改 (2)底行模式的常见命令…

复习之linux的网络配置

一、基本定义 1.IP IP指网际互连协议,Internet Protocol的缩写,是TCP/IP体系中的网络层协议。 电脑之间要实现网络通信,就必须要有一个合法的ip地址。 IP地址网络地址主机地址(又称:主机号和网络号组成&#xff09…

【MySQL】MyISAM中的索引方案

介绍 B树索引使用存储引擎如表所示: 索引/存储引擎MyISAMInnoDBMemoryB树索引支持支持支持 多个存储引擎支持同一种类型的索引,但是他们的实现原理是不同的。 InnoDB和MyISAM默认的索引是B树索引,而Memory默认的索引是Hash索引。 MyISAM…

【软件测试】在Windows使用Docker搭建CentOS环境(详细)

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 我们做软件测试在…

租服务器跑代码、pycharm连接服务器跑代码、Xshell连接服务器运行代码

一、服务器 1.1 注册 推荐使用矩池云服务器,按时按量计费,服务器自带镜像可选,可将要运行的项目上传到网盘 注册网址:矩池云 1.2 租用 选择合适的租用 1.3 选择镜像 选择合适的系统镜像 1.4 复制命令 进入租用列表&#xff…

【每日挠头算法题(9)】二叉树的直径|二叉树的层序遍历

文章目录 一、二叉树的直径思路:二叉树的深度优先搜索具体代码如下: 二、二叉树的层序遍历思路:借助队列实现具体代码如下: 总结: 一、二叉树的直径 点我直达~ 思路:二叉树的深度优先搜索 根据题目要求&a…

【计网】第三章 数据链路层

文章目录 数据链路层一、使用点对点信道的数据链路层1.1 数据链路和帧1.2 三个基本问题封装成帧透明传输差错控制 二、点对点协议 PPP2.1 PPP 协议的特点2.2 PPP 协议的帧格式2.3 PPP 协议的工作状态 三、使用广播信道的数据链路层3.1 局域网的数据链路层3.2 CSMA/CD 协议3.3 使…

安规测试简介(二)-常见安规认证测试之CE认证

CE认证: CE是法语的缩写,英文意思为 “European Conformity” 即”欧洲共同体”, 事实上,CE还是欧共体许多国家语种中的"欧共体"这一词组的缩写,原来用英语词组EUROPEAN COMMUNITY 缩写为EC,后因欧共体在法文…

python---字典(1)

字典的创建 字典: 是一种存储键值对的 键值对: 键(key) 值(value) 根据key可以快速的找到value (key和value有一定的映射关系) 在python字典中可以包含很多键值对,但是键是唯一的. 创建一个空的字典 创建字典的同时,设置初始值 推荐写法是如下的字典的初始化: 字典查找ke…

unittest教程__assert断言(4)

测试用例是否测试通过是通过将预期结果与实际结果做比较来判定的,那代码中怎么来判定用例是否通过呢?在python中这种判定的方法就叫做断言,断言可以使用python的assert方法,也可以使用unittest框架提供的一系列断言方法。 unitte…

强化历程2-Vue+axios+ajax面试系列(2023.6.17)

因为主要是后端,在此训练都是非常基础的题目,后续会持续更新… 文章目录 强化历程2-Vueaxiosajax面试系列(2023.6.18第一次更新)题目汇总1 Vue常用指令2 v-show和v-if区别3 讲一讲MVVM4 vue特点?5 vue组件之间的传值6 vue整合其他框架7 vue生命周期8 vue中实现路由…

通过共享内存进行通信(嵌入式学习)

通过共享内存进行通信 概念特点函数示例代码 概念 在Linux中,共享内存是一种进程间通信(IPC)机制,允许多个进程共享同一块内存区域。这种通信方式可以提供高效的数据传输,特别适用于需要频繁交换数据的场景。 IO间进…

【运动控制】安装固高运动控制卡驱动程序

【运动控制】安装固高运动控制卡驱动程序 1、背景2、卸载PCI设备3、安装驱动4、安装验证 1、背景 运动控制卡是用来做什么的?顾名思义,用来控制电机转动的。 本博客简单介绍固高科技(深圳)有限公司的运动控制卡的驱动安装。 在购买了固高控制卡后&…

网络层(3)6/12

1.网络层 网络层最大的特点就是提供路由,路由就是分组从源到目的地址时,绝定的端到端的路径 路由:路由是网络层最主要的工作任务 网关:一个网络域到另一个网络域的关卡,主要用于不同网段之间的通讯 路由的获取方式&…

OpenGL之鼠标拾取和模型控制

文章目录 鼠标拾取转化步骤步骤 0:2D 视口坐标步骤 1:3D 规范化设备坐标步骤2:4d 均匀剪辑坐标步骤3:4D 眼(相机)坐标步骤4:4d 世界坐标 源码 模型控制源码 鼠标拾取 转化步骤 使用鼠标单击或“…

PMP考试成绩查询流程

具体查询方法如下 当你在PMI的注册邮箱收到一封PMI发来的,标题为: 祝贺您获得PMP认证的邮件时,表明你通过了PMP考试。 若没收到邮件,可通过以下方式进行成绩查询: 1、打开PMI官网:www.pmi.org&#xff0…

给初级测试工程师的一些避坑建议

我遇到的大多数开发人员都不怎么热衷于测试。有些会去做测试,但大多数都不测试,不愿意测试,或者勉而为之。我喜欢测试,并且比起编写新的代码,愉快地花更多的时间在测试中。我认为,正是因为专注于测试&#…

【文生图系列】基础篇-变分推理(数学推导)

文章目录 KL散度前向 vs 反向 KL前向KL反向KL可视化 问题描述变分推理ELBO: Evidence Lower Bound参考 此篇博文主要介绍什么是变分推理(Variational Inference , VI),以及它的数学推导公式。变分推理,是机器学习中一种流行的方式,使用优化的…