多租户平台前端存储结构的选择

下图来源于cookie、localStorage 和 sessionStorage的区别及应用实例
1
既然localstorage无有效期,关闭浏览器还存在,那么用来存储用户的身份信息并不是太合适,先看一下B站中localstorage都存在了啥,原来把我搜索的记录都存在了下来。
1
因此用户登录之后的token信息,我还是存在cookie中,虽然后台还是会为token设置超时时间。
1
之前参考了一个网站,将菜单和权限存储在localstorage中,除非他很少变动。
多租户模式下,一个人可以拥有多个账套,打开不同页签,操作不同账套的数据,从上图看,应该存储在sessionStorage,例如
当前账套ID是16
1
看看http请求参数,与sessionStorage中存储的账套ID一致。
接着看另外一个账套
1
另外一个账套请求参数如下,与账套信息是匹配的
1
因此知道了,SaaS之类平台,租户信息应该存储在sessionStorage中,这样可以让用户操作不同账套,数据还不会错乱。
接下来再看状态管理pinia,状态数据是存储在内存中,当你在页面使用鼠标邮件刷新,这个数据就会消失。
1
赋值是下面的方式,这种方式,在页面刷新的时候,就会丢失。
1
pinia有持久化解决方案,Pinia学习-存储数据、修改数据以及持久化实现,不过写一个通用的存储模板后,不一定非得要这样一个组件,因为既然选择有一定周期的存储,一定是因为业务,既然业务存在,那么应该掌握好数据的生存周期,所以我的经验告诉我,我应该自行设置。
接下来附带了统一数据存取风格的代码

/* localStorage */
tool.local = {
	set(key, data, datetime = 0) {
		//加密
		if(sysConfig.LS_ENCRYPTION == "AES"){
			data = tool.crypto.AES.encrypt(JSON.stringify(data), sysConfig.LS_ENCRYPTION_key)
		}
        let cacheValue = {
            content: data,
            datetime: parseInt(datetime) === 0 ? 0 : new Date().getTime() + parseInt(datetime) * 1000
        }
        return localStorage.setItem(key, JSON.stringify(cacheValue))
	},
	get(key) {
        try {
            const value = JSON.parse(localStorage.getItem(key))
            if (value) {
                let nowTime = new Date().getTime()
                if (nowTime > value.datetime && value.datetime != 0) {
                    localStorage.removeItem(key)
                    return null;
                }
				//解密
				if(sysConfig.LS_ENCRYPTION == "AES"){
					value.content = JSON.parse(tool.crypto.AES.decrypt(value.content, sysConfig.LS_ENCRYPTION_key))
				}
                return value.content
            }
            return null
        } catch (err) {
            return null
        }
	},
	remove(key) {
		return localStorage.removeItem(key)
	},
	clear() {
		return localStorage.clear()
	}
}

/*sessionStorage*/
tool.session = {
	set(table, settings) {
		var _set = JSON.stringify(settings)
		return sessionStorage.setItem(table, _set);
	},
	get(table) {
		var data = sessionStorage.getItem(table);
		try {
			data = JSON.parse(data)
		} catch (err) {
			return null
		}
		return data;
	},
	remove(table) {
		return sessionStorage.removeItem(table);
	},
	clear() {
		return sessionStorage.clear();
	}
}

/*cookie*/
tool.cookie = {
	set(name, value, config={}) {
		var cfg = {
			expires: null,
			path: null,
			domain: null,
			secure: false,
			httpOnly: false,
			...config
		}
		var cookieStr = `${name}=${escape(value)}`
		if(cfg.expires){
			var exp = new Date()
			exp.setTime(exp.getTime() + parseInt(cfg.expires) * 1000)
			cookieStr += `;expires=${exp.toGMTString()}`
		}
		if(cfg.path){
			cookieStr += `;path=${cfg.path}`
		}
		if(cfg.domain){
			cookieStr += `;domain=${cfg.domain}`
		}
		document.cookie = cookieStr
	},
	get(name){
		var arr = document.cookie.match(new RegExp("(^| )"+name+"=([^;]*)(;|$)"))
		if(arr != null){
			return unescape(arr[2])
		}else{
			return null
		}
	},
	remove(name){
		var exp = new Date()
		exp.setTime(exp.getTime() - 1)
		document.cookie = `${name}=;expires=${exp.toGMTString()}`
	}
}

相关推荐

  1. 数智化招采平台层级租户能力价值

    2024-03-17 15:46:07       26 阅读
  2. Spring Boot中租户架构实现

    2024-03-17 15:46:07       30 阅读
  3. 支付平台选择服务器租用时要注意什么?

    2024-03-17 15:46:07       59 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-17 15:46:07       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-17 15:46:07       100 阅读
  3. 在Django里面运行非项目文件

    2024-03-17 15:46:07       82 阅读
  4. Python语言-面向对象

    2024-03-17 15:46:07       91 阅读

热门阅读

  1. linux ---vim的基本使用

    2024-03-17 15:46:07       43 阅读
  2. 前端面试练习24.3.16

    2024-03-17 15:46:07       47 阅读
  3. 速盾cdn:cdn关闭后多长生效?

    2024-03-17 15:46:07       39 阅读
  4. 【TypeScript系列】Iterators 和 Generators

    2024-03-17 15:46:07       38 阅读
  5. 代码随想录算法训练营 Day25|回溯算法2

    2024-03-17 15:46:07       46 阅读
  6. c++函数

    c++函数

    2024-03-17 15:46:07      43 阅读
  7. MySQL中查询所有表及其所有列的信息

    2024-03-17 15:46:07       40 阅读
  8. 快稳省工具总结

    2024-03-17 15:46:07       43 阅读
  9. Python基础语法

    2024-03-17 15:46:07       42 阅读
  10. 栈的顺序存储结构的构建(C++)+ 两栈共享空间

    2024-03-17 15:46:07       44 阅读
  11. 用vue实现“图书馆”前台

    2024-03-17 15:46:07       44 阅读
  12. C++的类型转换

    2024-03-17 15:46:07       45 阅读
  13. c语言实现https服务器(纯享版)

    2024-03-17 15:46:07       37 阅读
  14. Mysql挂掉怎么办

    2024-03-17 15:46:07       43 阅读