多租户前端需通过命名空间策略实现 localStorage 隔离,推荐使用 ${tenantId}:${key} 格式前缀,封装 TenantStorage 类统一读写,并在租户切换或登出时清理旧数据,同时集中管理键名提升一致性。

在多租户前端系统中,LocalStorage 本身不提供天然的租户隔离能力——它按域名(origin)划分作用域,同一域名下所有租户共享同一个 localStorage 对象。因此,必须通过命名空间(namespace)策略主动隔离数据,避免 A 租户误读/覆盖 B 租户的缓存。
为每个租户添加统一前缀
最常用且可靠的方式是:在所有 key 前拼接租户标识(如 tenantId 或子域名),形成唯一 key。租户标识应在登录后、应用初始化时确定,并全局可用。
- 推荐格式:
`${tenantId}:${key}`(如"acme:userInfo"、"beta:sidebarCollapsed") - 封装读写方法,避免散落各处手动拼接:
class TenantStorage {
constructor(tenantId) {
this.tenantId = tenantId;
}
key(key) {
return `${this.tenantId}:${key}`;
}
setItem(key, value) {
localStorage.setItem(this.key(key), typeof value === 'object' ? JSON.stringify(value) : value);
}
getItem(key) {
const raw = localStorage.getItem(this.key(key));
try {
return JSON.parse(raw);
} catch {
return raw;
}
}
removeItem(key) {
localStorage.removeItem(this.key(key));
}
}
使用时:const storage = new TenantStorage('acme'); storage.setItem('token', 'xxx');
租户切换时自动清理旧数据(可选但推荐)
用户从租户 A 切换到租户 B 时,若不清除 A 的缓存,可能残留敏感信息或造成状态混乱。可在切换逻辑中批量删除旧租户前缀的数据:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
- 遍历
localStorage所有 key,用key.startsWith('oldTenantId:')筛选并逐个removeItem - 注意性能:一般租户数据量不大,遍历 100–200 条 key 毫秒级完成;若担心阻塞,可用
setTimeout异步清理 - 也可在登出时统一清空当前租户全部数据,而非等到切换才处理
避免硬编码 key,统一管理租户级存储键名
不同模块(用户中心、设置页、报表)各自定义 key 容易重复或格式不一致。建议集中声明:
- 创建
tenantStorageKeys.js文件,导出对象:
export const TenantKeys = {
TOKEN: 'token',
USER_INFO: 'userInfo',
THEME: 'theme',
LAST_ROUTE: 'lastRoute'
};
- 业务代码中直接引用:
storage.getItem(TenantKeys.TOKEN),提升可维护性与一致性
补充说明:不依赖子域名隔离
有人考虑为每个租户分配独立子域名(如 acme.example.com、beta.example.com),让浏览器自动隔离 localStorage。这虽可行,但需配套 DNS、HTTPS 证书、反向代理等运维支持,对 SaaS 前端而言成本高、灵活性差。多数场景下,前缀隔离 + 清理机制已足够安全可靠。

















