cookie、localStorage 和sessionStorage

news2024/12/23 9:39:25

文章目录

  • Cookie
      • 1.什么是 Cookie?
      • 2.cookie的工作机制,运作流程
      • cookie属性项
      • 3.读取cookie
      • 4.修改cookie
      • 5.删除cookie
    • localStorage 和sessionStorage
      • 1.生存期
      • 2.数据结构
      • 3.API 不管是 localStorage,还是 sessionStorage,可使用的API都相同,常用的有如下几个(以localStorage为例)
      • 4.过期时间
    • 区别 localStorage、sessionStorage、cookie、IndexDB

Cookie

1.什么是 Cookie?

Cookie 是一些数据, 存储于你电脑上的文本文件中。

当 web 服务器向浏览器发送 web 页面时,在连接关闭后,服务端不会记录用户的信息。

Cookie 的作用就是用于解决 “如何记录客户端的用户信息”:

  • 当用户访问 web 页面时,他的名字可以记录在 cookie 中。
  • 在用户下一次访问该页面时,可以在 cookie 中读取用户访问记录。
  • 存储量4kb

2.cookie的工作机制,运作流程

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

在这里插入图片描述

cookie属性项

document.cookie="username=mxr; expires=Thu, 18 Dec 2043 12:00:00 GMT; path=/";
  • 第一个参数为要设置的cookie键值对
  • 第二个参数为设置过期时间
  • path 参数告诉浏览器 cookie 的路径。默认情况下,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)
     }
   }
}

3.读取cookie

var x = document.cookie;

4.修改cookie

  • 重新为cookie赋值将会覆盖旧的cookie即完成修改
document.cookie="username=cxy; expires=Thu, 18 Dec 2043 12:00:00 GMT; path=/";

旧的 cookie 将被覆盖

5.删除cookie

  • 将日期改为之前的日期即可完成删除
document.cookie = "username=; expires=Thu, 01 Jan 1970 00:00:00 GMT";

localStorage 和sessionStorage

localStorage 对应 window.localStorage,sessionStorage 对应 window.sessionStorage。

在这里插入图片描述

  • 这里的作用域指的是:如何隔离开不同页面之间的localStorage(总不能在百度的页面上能读到腾讯的localStorage吧,哈哈哈)。

  • localStorage只要在相同的协议、相同的主机名、相同的端口下,就能读取/修改到同一份localStorage数据。

  • sessionStorage比localStorage更严苛一点,除了协议、主机名、端口外,还要求在同一窗口(也就是浏览器的标签页)下。

1.生存期

  • localStorage理论上来说是永久有效的,即不主动清空的话就不会消失,即使保存的数据超出了浏览器所规定的大小,也不会把旧数据清空而只会报错。但需要注意的是,在移动设备上的浏览器或各Native App用到的WebView里,localStorage都是不可靠的,可能会因为各种原因(比如说退出App、网络切换、内存不足等原因)被清空。

  • sessionStorage的生存期顾名思义,类似于session,只要关闭浏览器(也包括浏览器的标签页),就会被清空。由于sessionStorage的生存期太短,因此应用场景很有限,但从另一方面来看,不容易出现异常情况,比较可靠。

2.数据结构

  • localstorage为标准的键值对(Key-Value,简称KV)数据类型,简单但也易扩展,只要以某种编码方式把想要存储进localstorage的对象给转化成字符串,就能轻松支持。举点例子:把对象转换成json字符串,就能让存储对象了;把图片转换成DataUrl(base64),就可以存储图片了。另外对于键值对数据类型来说,"键是唯一的"这个特性也是相当重要的,重复以同一个键来赋值的话,会覆盖上次的值。
const useStorage = (storageKey = "authorization") => {
    const localKey = `devpoint.local.${storageKey}`;

    const toJson = (str) => {
        try {
            return JSON.parse(str);
        } catch {
            return str;
        }
    };
    const toStringfy = (value)=>{
        try {
            return JSON.stringify(value);
        } catch {
            return value;
        }
    }

    const save = (data) => {
        window.localStorage.setItem(localKey, JSON.stringify(data));
    };

    const get = () => {
        const localData = window.localStorage.getItem(localKey);
        if (localData && localData !== "") {
            return toJson(localData);
        } else {
            return false;
        }
    };
    /**
     * Delete
     */
    const del = () => {
        window.localStorage.removeItem(localKey);
    };
    /**
     * 清除所有的 localStorage
     */
    const clear = () => {
        window.localStorage.clear();
    };
    // 返回存储对象处理方法
    return {
        save,
        get,
        del,
        clear,
    };
};
const storageAuth = useStorage();
const loginInfo = {
    username: "DevPoint",
    age: 30,
};
storageAuth.save(loginInfo);
console.log(storageAuth.get());

3.API 不管是 localStorage,还是 sessionStorage,可使用的API都相同,常用的有如下几个(以localStorage为例)

  • 保存数据:localStorage.setItem(key,value);
  • 读取数据:localStorage.getItem(key);
  • 删除单个数据:localStorage.removeItem(key);
  • 删除所有数据:localStorage.clear();
  • 得到某个索引的key:localStorage.key(index);

提示: 键/值对通常以字符串存储,你可以按自己的需要转换该格式。

4.过期时间

sessionStorage 方法针对一个 session 进行数据存储。当用户关闭浏览器窗口后,数据会被删除。

  • 很遗憾,localstorage原生是不支持设置过期时间的,想要设置的话,就只能自己来封装一层逻辑来实现:
function set(key,value){
  var curtime = new Date().getTime();//获取当前时间
  localStorage.setItem(key,JSON.stringify({val:value,time:curtime}));//转换成json字符串序列
}
function get(key,exp)//exp是设置的过期时间
{
  var val = localStorage.getItem(key);//获取存储的元素
  var dataobj = JSON.parse(val);//解析出json对象
  if(new Date().getTime() - dataobj.time > exp)//如果当前时间-减去存储的元素在创建时候设置的时间 > 过期时间
  {
    console.log("expires");//提示过期
  }
  else{
    console.log("val="+dataobj.val);
  }
}

容量限制
目前业界基本上统一为5M

在ios设备上无法重复setItem()

另外,在iPhone/iPad上有时设置setItem()时会出现诡异的QUOTA_EXCEEDED_ERR错误,这时一般在setItem之前,先removeItem()就ok了。

区别 localStorage、sessionStorage、cookie、IndexDB

  • localStorage:完全存在于客户端(浏览器)中的键/值存储。用于存储不需要发送到服务器的身份验证 Token 或者离线数据。

  • sessionStorage:一种键/值存储,其功能与 localStorage 类似,但在用户关闭页面时过期/清除,即使在同一域中也不会跨选项卡共享,最适用于存储临时数据。

  • cookie:可以在浏览器中读取和写入的数据,但也会随着每个请求的 cookie header 中的传输到服务器。

  • IndexDB:一个存在于浏览器中的数据库,单独使用有点困难,但与 PouchDB 等工具配合使用,可用于存储需要查询和性能要求的更复杂的客户端数据。

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

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

相关文章

基于FPGA+MPU+MCU全自动血细胞分析仪解决方案

全自动血细胞分析仪是医院临床检验应用非常广泛的仪器之一,用来检测红细胞、血红蛋白、白细胞、血小板等项目。是基于电子技术和自动化技术的全自动智能设备,功能齐全,操作简单,依托相关计算机系统在数据处理和数据分析等方面具有…

蓝牙学习三(GAP)

1.简介 GAP(Generic Access Profile-通用访问配置文件)与应用层紧密相连,所以要想了解BLE,GAP是必须认识的东西。 在第一章中我们说过GAP层,GAP层目前主要用来进行广播、扫描和发起连接。GAP保证了不同的BLE设备可以互…

深度学习入门(7)误差反向传播计算方式及简单计算层的实现

在上一节中《深度学习入门(6)误差反向传播基础---计算图与链式法则》,我们介绍了误差反向传播的计算图与导数计算的链式法则,这一节主要介绍计算图中各计算节点的误差反向传播计算方式,以及加法与乘法层的实现。 目录…

Scala系列-4、scala中特质、柯里化、闭包等

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 传送门:大数据系列文章目录 目录scala中特质特质作为接口使用特质中放置非抽象的成员特质的模板操作特质的混入对象操作特质的执行链…

T31开发笔记: 使用FTP上传下载文件

若该文为原创文章,转载请注明原文出处 一、前言 最段时间,在开发IPC时,突然想到把录制好的MP4文件上传到服务器,考虑了一些方法,感觉用TFP方式比较好,可以下载和上传文件,只需要搭建一个简单的…

【Mybatis编程:修改数据(动态SQL)】

目录 1. 在AlbumMapper.java中添加抽象方法 2. 在AlbumMapper.xml中配置SQL 3. 在AlbumMapperTests.java中编写并执行测试 1. 在AlbumMapper.java中添加抽象方法 在AlbumMapper.java中添加抽象方法: /** * 修改相册数据 * * param album 封装了被修改的相册的…

【Mybatis编程:批量插入相册(动态SQL)】

目录 1. 书写SQL语句 2. 在AlbumMapper.java中添加抽象方法 3. 在AlbumMapper.xml中配置SQL 4. 在AlbumMapperTests.java中编写并执行测试 1. 书写SQL语句 需要执行的SQL语句大致是: insert into pms_album (name, description, sort) values (?,?,?), (?…

AcWing算法基础课笔记 1.基础算法

目录AcWing算法基础课笔记 1.基础算法二分排序基本思想代码归并排序基本思路代码高精度计算加法减法乘法除法前缀和一维二维AcWing算法基础课笔记 1.基础算法 二分排序 基本思想 基于分治的思想 确定哨兵xxx:可以取左边界,中间值,右边界&…

Docker的容器管理操作

Docker的容器管理操作Docker的容器管理操作1. 创建容器2. 启动容器3、查看容器的运行状态4、创建并启动容器5、在后台持续运行 docker run 创建的容器6、停止容器7、 删除容器8、 容器的进入9、查看容器的元数据——docker inspect10、容器日志11、宿主机和容器之间的文件复制将…

Android——FloatingActionButton使用说明以及避坑

1、简介 1.1、 com.android.support库下 compile com.android.support:design:26.0.0 1.2、material库下 com.google.android.material.floatingactionbutton.FloatingActionButton 库下 implementation com.google.android.material:material:1.1.0 官方地址:…

怎么有效地进行问卷发放?

进行问卷调查分为四步:制作问卷、发放问卷、收集问卷、分析问卷。其中,发放问卷起到了关键性的作用。他关乎到我们后续收集问卷是否顺利,收集到的问卷数据是否具备真实性和有效性。那么,怎么有效地进行问卷发放呢? 1、…

右键实现打开对应的软件

右键实现打开对应的软件前言:下面我以右键打开Pycharm为例子!!!一、打开注册表1.1 WinR,输入regedit,回车二、实现右键打开特定文件的效果2.1找到路径:计算机\HKEY_CLASSES_ROOT\*\shell2.2 创建文件夹2.3 …

【In-Context Learning】Meta-learning via Language Model In-context Tuning

In-Context Learning是最近比较火热的方向,其主要针对超大规模模型(例如1750B参数量的GPT-3模型),在只提供少量标注样本作为提示的前提下,即可以实现很惊艳的效果。本文将元学习引入到In-Context Learning中。 论文PDF…

企业实践开源的动机

文章来源:” 夜天之书 “微信公众号 作者:tison 随着开源软件全面占据软件供应链的各个阶段,商业公司开发基础软件或业务逻辑的时候,已经避不开对软件的使用了。经过一段时间对开源软件的使用,以及开源吞噬软件的趋势…

海量Redis数据库优化,vivo如何实现成本与性能的平衡

概述 随着数字化技术的创新以及时延敏感型应用的持续落地,越来越多的数据需要实现实时或近实时的处理,这推动了 Redis 等内存数据库的广泛应用。此类数据库对于内存容量有着较高的要求,在数据快速增长的背景下,大内存池构建意味着…

分布式监控平台——Zabbix

市场上常用的监控软件: 传统运维:zabbix、 Nagios云原生环境: Prometheus (go语言开发的) 一 Zabbix概述 作为一个运维,需要会使用监控系统查看服务器状态以及网站流量指标,利用监控系统的数据…

二叉树的遍历-树-数据结构和算法(Java)

1 树的遍历方式 1.1 深度优先 事实上,深度优先搜索属于图算法的一种,英文缩写为DFS即Depth First Search.其过程简要来说是对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次. 那么对于树来说,"深度优先…

使用阿里云国际版负载均衡管理多台服务器上的流量

有效处理多云服务器设置的流量和数据传输负载可能是一个复杂的过程。然而,这是完全必要的,因为业务关键型应用程序需要高度可用的解决方案来管理繁重的工作负载。阿里云服务器负载均衡器(SLB) 简化了工作负载在服务器、网络链路和其他资源之间的分配&…

[附源码]SSM计算机毕业设计闲置物品交易管理系统JAVA

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

mac系统废纸篓可以恢复么,mac不小心清空了废纸篓怎么找回

在使用Mac电脑的过程中,有可能会出现各种意外,其中误删文件是很常见的一种。如果你不小心删除了废纸篓里还有用的文件,mac系统废纸篓可以恢复么? 一、我不小心删除了重要文件,还清倒了废纸篓 案例分享:mac…