前端缓存使用规范

一、Cookie使用规范

cookie的存储空间非常有限且会携带在请求头中会浪费不必要的流量,如果仅仅是为存储数据,可以采用其他替代方案,例如 webStorage,非必要不使用cookie。

1、使用方法

注意:过期时间时需转换成UTC格式

//创建 &修改-设置过期时间为30分钟
document.cookie=`KN=Joy;domain=.docs.paic.com.cn';path=/#/post;expires=${new Date(new Date().getTime() + 1800000).toUTCString()}`
// 删除,需要删除的cookie只需要将过期时间设置为当前时间即可
document.cookie=`KN=Joy;domain=.docs.paic.com.cn';path=/#/post;expires=${new Date().toUTCString()}`
//查看
console.log(document.cookie)//cookie目前没有api可以直接拿到key值,只能拿到所有的cookie再做过滤
// 取值方法参考
function getCookie (cookieName) {var allcookies = document.cookievar cookiePos = allcookies.indexOf(cookieName + '=')if (cookiePos !== -1) {cookiePos += cookieName.length + 1var cookieEnd = allcookies.indexOf(';', cookiePos)if (cookieEnd === -1) {cookieEnd = allcookies.length}allcookies = allcookies.substring(cookiePos, cookieEnd) if (allcookies && allcookies.indexOf('{') === 0) {return JSON.parse(allcookies || '{}');} else {return allcookies;}} else {return {}}},

2、使用场景

  • 数据透传 ,cookie可以跨域,在同一父域可以共享;
  • 服务端创建的数据 ,若只涉及后端使用注意使用httpOnly属性;
  • 全局数据,可做全局数据缓存在cookie中。

3、替代方案

cookie前后端都可以写入,在非必要不创建cookie的前提下,前后端都应该对cookie保持克制

  • 数据透传 ,url带参可以实现数据透传;
  • 服务端创建的数据 ,通过responents返回,再由前统一设置到请求参数体中;
  • 全局数据,使用webStorage替代存储,例如localStoragesessionStorage

4、使用规范

1. key由1~4位大写字母、数字、下划线组成,命名尽量精简; 例如 userInfo,可以命名为UI

//good
document.cookie=`UI=Joy;domain=.docs.paic.com.cn';path=/#/post;expires=${new Date(new Date().getTime() + 1800000).toUTCString()}`
document.cookie=`BP_D=ndnakswwww;domain=.docs.paic.com.cn';path=/#/post;expires=${new Date(new Date().getTime() + 1800000).toUTCString()}`//bad
document.cookie=`userInfo=Joy;domain=.docs.paic.com.cn';path=/#/post;expires=${new Date(new Date().getTime() + 1800000).toUTCString()}`
document.cookie=`bankparam-data=ndnakswwww;domain=.docs.paic.com.cn';path=/#/post;expires=${new Date(new Date().getTime() + 1800000).toUTCString()}`

2. value单个长度不超过200个英文字符,大小不超过400B

3. 禁止存入直接由JSON格式转成的字符串, 直接由JSON转成字符串会增加{}""占用不必要的内存,改为kv格式存储,以&连接符区分,例k=1&k2=2

//好例子
var userInfo={name:'joy',age:18
}
var data = JSON.stringify(userInfo)var parseData=Object.keys(userInfo).reduce((cur,acc,index)=>{let icon=index?'&':''return  cur+ icon+acc+'='+userInfo[acc]
},'')//name=joy&age=18
document.cookie=`UI=${parseData};domain=.docs.paic.com.cn';path=/#/post;expires=${new Date(new Date().getTime() + 1800000).toUTCString()}`
//坏例子;将json直接转成字符串存入cookie中
document.cookie=`UI=${data};domain=.docs.paic.com.cn';path=/#/post;expires=${new Date(new Date().getTime() + 1800000).toUTCString()}`

4. cookie总大小不超过4094B,总数量不超过20个

5. 禁止设置永久cookie,应该根据评审设置合理过期时间,可参考一般过期时间段7分钟、30分钟、7天、14天、1个月、2个月

//good
document.cookie=`UI=Joy;domain=.docs.paic.com.cn';path=/#/post;expires=${new Date(new Date().getTime() + 1800000).toUTCString()}`
//bad
document.cookie=`userInfo=Joy;domain=.docs.paic.com.cn';path=/#/post;`

6. 设置合理的domainpath;浏览器会将domainpath都相同的cookie保存在一个文件里,cookie间用*隔开,合理的设置domainpath既可以满足开发需求,也能非常的有效的减少cookie的范围,继而避免影响其他页面;

//good
document.cookie=`UI=Joy;domain=.docs.paic.com.cn';path=/#/post;expires=${new Date(new Date().getTime() + 1800000).toUTCString()}`
//bad
document.cookie=`userInfo=Joy;expires=${new Date(new Date().getTime() + 1800000).toUTCString()}`

7. 确保cookie有效(不允许存入空值)

//bad
document.cookie=`UI=null;domain=.docs.paic.com.cn';path=/#/post;`
document.cookie=`UI={};domain=.docs.paic.com.cn';path=/#/post;`

8. 明确为业务方自己使用的cookie,用完后应立即删除


5、客观限制

1. 长度限制
  • 大多数浏览器支持最多可达 4096 字节的 Cookie。
2. 数量限制
  • 大多数浏览器只允许每个站点保存 20 个 Cookie。如果试图保存更多的 Cookie,则最先保存的 Cookie 就会被删除。还有些浏览器会对来所有站点的Cookie 总数作出限制,这个限制通常为 300 个
  • 参考数据(由于尚有部分业务条线需要支持ie7和ie8,因此以此版本为示例,其他IE版本暂不列出)
限制类别限制IE7.0 8.0OperaFire FoxSafariChrome
Cookie个数每个域名 50个每个域名 30个每个域名 50个没有限制每个域名 53个
Cookie大小4095字节4096字节4097字节4097字节4097字节

二、webStorage使用规范

localStoragesessionStorage 是一种 web 存储方式,存储大小可以达到5M,相比cookie webStorage可以便于我们存储更多的数据,我们可以在使用JavaScript 编写网站和 app 时用它来存储数据到浏览器中。

平时开发中,localStoragesessionStorage 用途是非常多,在我们的开发中发挥着非常重要的作用:

  1. 登录完成后 token 的存储
  2. 用户部分信息的存储,比如 昵称、头像、简介
  3. 一些项目通用参数的存储,例如 某个id、某个参数params
  4. 项目状态管理的持久化,例如 vuex的持久化、redux的持久化
  5. 项目整体的切换状态存储,例如 主题颜色、icon风格、语言标识

1、localStorage与sessionStorage的区别

1. 生存期

  • localStorage数据可以长久地存储,也就意味着浏览器窗口关闭后数据也不会丢失**(localStorage 在 IE 浏览器中,IE8 以上才支持 localStorage)

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

  • sessionStorage关闭浏览器窗口后数据会丢失失效

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

2. 作用域

  • localStorage 只要在相同的协议、相同的主机名、相同的端口下,就能读取/修改到同一份 localStorage 数据;
  • sessionStorage 比 localStorage 更严苛一点,除了协议、主机名、端口外,还要求在同一窗口(也就是浏览器的标签页)下。

3. API

localStorage
// 新增/修改
localStorage.setItem(key, value)
// 获取
localStorage.getItem(key)
// 删除
localStorage.removeItem(key)
//清空
localStorage.clear()
sessionStorage
// 新增/修改
sessionStorage.setItem(key, value)
// 获取
sessionStorage.getItem(key)
// 删除
sessionStorage.removeItem(key)
//清空
sessionStorage.clear()

 

2、命名

同源的两个项目,它们的 localStorage ,sessionStorage 是互通的。两个项目都需要存储一个 key 为 name 的值,那么这就会造成两个项目的 name 互相顶替的现象,也就是 互相污染现象,例如:

  • 存用户信息会使用 user 作为 key 来存储
  • 主题的时候用 theme 作为 key 来存储
  • 令牌时使用 token 作为 key 来存储

为了在命名上起到隔离作用,推荐几种命名规则:

  1. appKey+缓存key值;
  2. 项目名+缓存key值;
  3. 组织编码+缓存key值;
// good
localStorage.setItem( 'A1007_appkey' , 'xxx')
localStorage.setItem( 'epecker_theme' , 'primary')
localStorage.setItem( 'ARCH_epecker_token' , '3234u390hedidn2eijdws-2e')// bad
localStorage.setItem( 'appkey' , 'xxx')
localStorage.setItem( 'theme' , 'primary')
localStorage.setItem( 'token' , '3234u390hedidn2eijdws-2e')

 

3、数据加密

将缓存的数据存在 localStorage、sessionStorage 中,,确实有利于的开发及数据的查看,点击application就可以看到。但是产品一旦上线有些东西不希望被用户看到。这个时候就需要对缓存的数据进行加密了。

1. 网银的国密 js

16 年由网银采购,仅支持非对称加密 sm2 的加解密,不支持签名,摘要和对称加密


注意事项

1、网银 js 的公钥跟其他开发语言和加密平台不一样,由 x,y 组成,比如:

java 的公钥:key="C2C965F4A094CD3B5FD6449E1CC7E068983A5C1317DF35DFDD931AB022BBCF7E C3CA265BC1D52BF9B857074F9C9F34C52D60A9949E883538ACBA0409A6D8049E"则 js 的公钥为(前一半为 x,后一半为 y):X: “C2C965F4A094CD3B5FD6449E1CC7E068983A5C1317DF35DFDD931AB022BBCF7E"Y: “C3CA265BC1D52BF9B857074F9C9F34C52D60A9949E883538ACBA0409A6D8049E"

2、国密 java 版本 sm-crypto 公钥加密,js 私钥解密失败,如何解决?

sm-crypto 的密文都做转换为大写,而 js 支持小写,把 sm-crypto 的密文转为小写即可正常解密。

2. 开源实现

支持国密的所有算法,请自行下载

  1. GitHub - JuneAndGreen/sm-crypto: 国密算法js版
  2. GitHub - sickworm/sm-series-crypto: SM2/SM3/SM4 in javascript implementation.

4、webStorage 使用方案

  • 全局使用的东西,共享的东西,永久存储的东西储存在 localstorage 中
  • 不需要永久存储的东西在使用完毕之后要记得及时清除
  • 如果数据量过大就不要存储在本地了,变为动态获取
  • 可以使用存储量更大的 Indexeddb,不过有兼容性问题
  • 可以在实现方案中对要存储到 storage 中的东西做字数限制

三、其他

1、域名限制

  • 由于浏览器的安全策略,localstorage 是无法跨域的,也无法让子域名继承父域名的 localstorage 数据,这点跟 cookies 的差别还是较大的。

2、数据存储

  • sessionStorage 和 localStorage 不会自动把数据发送给服务器,仅在本地保存。
  • cookie 数据始终在同源的 http 请求中携带(即使不需要),即 cookie 在浏览器和服务器间来回传递。cookie 数据还有路径(path)的概念,可以限制 cookie 只属于某个路径下ker

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

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

相关文章

内存安全的编程语言

美国政府新颁布《回归基础构件:通往安全软件之路》 《回归基础构件:通往安全软件之路》中,白宫国家网络主任办公室(ONCD)呼吁开发者使用「内存安全的编程语言」 内存安全的编程语言 根据NSA的建议,内存…

sqlyog社区版下载,数据库客户端,mysql

Downloads webyog/sqlyog-community Wiki GitHubhttps://github.com/webyog/sqlyog-community/wiki/Downloadssqlyog社区版下载

liteIDE 解决go root报错 go: cannot find GOROOT directory: c:\go

liteIDE环境配置 我使用的liteIDE为 x36 5.9.5版本 。在查看–>选项 中可以看到 LiteEnv,双击LiteEnv ,在右侧选择对应系统的env文件,我的是win64系统,所以文件名为win64.env 再双击 win64.env ,关闭当前窗口&…

git 初始化项目并上传到github

如果还没配置过,需要配置账号信息 git config --global user.name "baymax-collab" git config --global user.email "baymax-collabtest.com"创建一个新的存储库 git clone gitgithub.com:xxxx cd test git switch --create main touch READ…

C++ Qt开发:QHostInfo主机地址查询组件

Qt 是一个跨平台C图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍如何运用QHostInfo组件实现对主机地址查询功能…

ROS——VirtualBox下载

下载&安装Virtualbox Oracle VM VirtualBox 根据电脑系统版本下载。 注意:前提是电脑cpu要开启虚拟化 根据自己的需求下载 双击开始安装 浏览可以更改下载位置,默认在C盘 然后一直点,是或下一步就好了 下载拓展包 后续需要连接使…

NASA数据集——GOES-16卫星的高级图像和地球观测数据

简介 GHRSST NOAA/STAR GOES-16 ABI L2P America Region SST v2.70 dataset in GDS2 ABI_G16-STAR-L2P-v2.70是美国国家航空航天局(NASA)的一种卫星数据处理产品。这个产品是由GOES-16(也称为GOES-East)卫星的先进基线/全球地球…

201909青少年软件编程(Scratch)等级考试试卷(三级)

青少年软件编程(Scratch)等级考试试卷(三级)2019年9月 第1题:【 单选题】 执行下面的脚本后,变量“分数”的值是多少?() A:5 B:6 C:10 D:25 【正确答案】: C 【试题…

Day3 DOM-节点操作

3.1 节点 节点:标签、文本、注释、换行等,节点类型nodeType、节点名称nodeName、节点值nodeValue 元素:标签 节点层级:父节点、子节点、兄弟节点 parentNode父节点的最大节点是document,再朝上查找就是null prentElem…

2024年华为OD机试真题-提取字符串中的最长数学表达式并计算-Java-OD统一考试(C卷)

题目描述: 提取字符串中的最长合法简单数学表达式,字符串长度最长的,并计算表达式的值。如果没有,则返回0 简单数学表达式只能包含以下内容 0-9数字,符号 +-* 说明: 1. 所有数字,计算结果都不超过long 2. 如果有多个长度一样的,请返回第一个表达式的结果 3. 数学表达式…

day18_支付宝支付项目部署(保存支付信息,支付接口,支付宝异步回调)

文章目录 1 支付1.1 需求说明1.2 支付宝支付1.2.1 产品介绍产品特色使用示例申请条件费率 1.2.2 接入准备1.2.3 手机网站支付快速接入1.2.4 官方demo研究 1.3 环境搭建(service-pay)1.4 后端接口1.4.1 保存支付信息实现流程说明查询订单接口开发openFeign接口定义代码实现添加依…

Rust:Arc::new(...) 生成的变量保存在堆上吗?

是的,当你使用 Arc::new(...) 在 Rust 中创建一个新的 Arc(Atomic Reference Counted)时,传递给 Arc::new 的数据(或其副本)会被分配到堆上。Arc 是一个引用计数智能指针,它允许数据在多个所有者…

Kafka MQ 主题和分区

Kafka MQ 主题和分区 Kafka 的消息通过 主题 进行分类。主题就好比数据库的表,或者文件系统里的文件夹。主题可以被分为若干个 分区 ,一个分区就是一个提交日志。消息以追加的方式写入分区,然 后以先入先出的顺序读取。要注意,由…

新一代 Git 工具,AI 赋能!深度集成、简化操作 | 开源日报 No.194

gitbutlerapp/gitbutler Stars: 7.2k License: NOASSERTION gitbutler 是一个基于 Git 的版本控制客户端。旨在为现代工作流程构建一个全新的 Git 分支管理工具。 虚拟分支:可以同时在多个分支上工作,而无需不断切换分支简化提交管理:通过拖…

勒索软件事件手册:综合指南

近年来,勒索软件攻击的频率和复杂程度都急剧增加。这些攻击的影响可能是毁灭性的,从经济损失到严重的运营中断。 这就是为什么对于希望防范这种网络安全威胁的企业来说, 强大的勒索软件事件响应手册是不可谈判的。 本指南旨在深入了解勒索软…

项目管理技巧分享:如何有效拆分复杂项目?

项目经理需要理清三个问题:1.项目的达成目标是什么,2.项目执行周期有多长,3.项目预计成本是多少?复杂项目在管理执行上难度都较大,通常需要进行分解,并且这个过程离不开项目管理系统的支持。这篇文章告诉你…

《解密云计算:企业之选》

前言 在当今数字化时代,企业面临着巨大的数据处理压力和信息化需求,传统的IT架构已经无法满足日益增长的业务需求。在这样的背景下,越来越多的企业开始转向云计算,以实现灵活、高效和可扩展的IT资源管理和利用。 云计算 云计算是一种基于互联网的计算模式,它通过将数据、…

【字符串】【分类讨论】【KMP】1163. 按字典序排在最后的子串

作者推荐 视频算法专题 本文涉及知识点 字符串 字典序 分类讨论 本题无法使用KMP,因为t1不段变化。 LeetCode1163. 按字典序排在最后的子串 给你一个字符串 s ,找出它的所有子串并按字典序排列,返回排在最后的那个子串。 示例 1&#xf…

ajax中各个参数的含义是什么?

在 AJAX(Asynchronous JavaScript and XML)中,当使用不同的方法或库来发送请求时,参数会有所不同。但是,如果我们以 jQuery 的 $.ajax 方法为例,我们可以详细解释其中一些常见的参数及其含义: u…

Windows 安装 Xinference

Windows 安装 Xinference 0. 引言1. 创建虚拟环境2. 安装 pytorch3. 安装 llama_cpp_python4. 安装 chatglm-cpp5. 安装 Xinference6. 设置 model 路径7. 启动 Xinference8. 查看 Cluster Information 0. 引言 Xorbits Inference(Xinference)是一个性能…