sessionstorage.setitem存了却读不到的最常见原因是会话隔离——它严格限定于单个标签页,新开同url标签页即为全新会话,数据不共享;其他原因包括跨域iframe访问触发securityerror、无痕模式禁用、存入未序列化的对象或undefined导致隐式转字符串失败。

sessionStorage.setItem 为什么存了却读不到?
最常见原因是误以为同一域名下所有标签页共享数据——其实 sessionStorage 严格隔离在单个标签页内,新开一个相同 URL 的标签页,sessionStorage 是空的,不是“没存进去”,是根本不在同一个会话上下文里。
其他典型原因包括:
- 在 iframe 中跨域访问,直接抛
SecurityError,控制台可见错误 - 无痕/隐私模式下部分浏览器禁用
sessionStorage(尤其企业定制版浏览器),需加try...catch容错 - 存了
undefined或对象未序列化:比如sessionStorage.setItem('user', {})实际存入的是"[object Object]",后续JSON.parse()必然失败
存对象必须手动 JSON.stringify 吗?
必须。因为 sessionStorage 底层只接受字符串值,任何非字符串类型都会被隐式调用 .toString(),导致 Array 变成逗号分隔字符串、Object 变成 "[object Object]"、undefined 变成 "undefined"。
安全写法示例:
const data = { id: 123, name: 'Alice', tags: ['a', 'b'] };
sessionStorage.setItem('user', JSON.stringify(data));
// 读取时加兜底
const raw = sessionStorage.getItem('user');
const user = raw ? JSON.parse(raw) : null;
注意:如果原始对象含函数、Date、RegExp 或循环引用,JSON.stringify 会静默丢弃或报错,这类结构不适合用 sessionStorage 存。
刷新页面后数据还在吗?
在。页面刷新、前进/后退、甚至通过 location.reload() 重载,都不会清空 sessionStorage —— 它的生命周期绑定的是「标签页会话」,不是「单次页面加载」。
使用 Playwright 为 jimeng.jianying.com 管理浏览器会话,导入 cookies/localStorage 以自动化视频生成工作流,支持图片上传等功能
但以下操作会清空:
- 用户手动关闭该标签页(哪怕只关一个)
- 调用
sessionStorage.clear()或sessionStorage.removeItem('key') - 整个浏览器进程被强制退出(如 kill 进程、系统崩溃)
所以它适合做「表单草稿暂存」「筛选条件保持」「弹窗展示标记」这类需要跨路由/跨刷新延续、但不跨标签页泄露的状态。
和 localStorage 混用时容易踩什么坑?
最大的混淆点是「同源但不同作用域」:同一域名下,localStorage 数据所有标签页共享,sessionStorage 完全不共享。如果代码里本意是存当前页独有状态,却误用了 localStorage,就可能造成多标签页互相覆盖或干扰。
另一个实际问题:两者 API 完全一致,但容量限制不同(sessionStorage 通常略小,约 5MB;localStorage 约 5–10MB),存大体积数据(如 base64 图片、长日志)前应先检查 sessionStorage 是否足够,否则可能静默失败或触发异常。
建议明确命名区分,比如统一用 ss_ 前缀标识 sessionStorage 键:ss_formDraft、ss_filterState,避免后期维护时混淆。










