聊聊sessionStorag,以及什么情况下能够共享/复制sessionStroage

news2025/1/13 10:23:43

之前对sessionStorage的了解很表面,粗略的理解为在各标签页/窗口下独立,生命周期和标签页/窗口关联,标签页/窗口未关闭就存在(除人为清除或者调用相关api删除)。但是这种粗略的理解对于下面的场景似乎就有点不明确了。

  1. 如果一个文档通过iframe嵌入了一个同源的地址,那这个文档和嵌入的iframe的sessionStorage是否共享?【是】
  2. 如果一个文档通过iframe嵌入一个同源地址两次,那么这两个同源地址的sessionStorage是否共享?【是】
  3. 如果想让iframe嵌入的地址共享当前文档的sessionStorage是否可以实现?
  4. 不同标签页之间能实现sessionStorage共享吗【不能。但是可以在创建标签页的时候用当前页的sessionStorage初始化新标签】

1. MDN中对sessionStorage的解释:

sessionStorage 属性允许你访问一个,对应当前源的 session Storage 对象。它与 localStorage 相似,不同之处在于 localStorage 里面存储的数据没有过期时间设置,而存储在 sessionStorage 里面的数据在页面会话结束时会被清除。

  1. 页面会话在浏览器打开期间一直保持,并且重新加载或恢复页面仍会保持原来的页面会话。
  2. 在新标签或窗口打开一个页面时会复制顶级浏览会话的上下文作为新会话的上下文,这点和 session cookie 的运行方式不同
  3. 打开多个相同的 URL 的 Tabs 页面,会创建各自的 sessionStorage。
  4. 关闭对应浏览器标签或窗口,会清除对应的 sessionStorage。
    除了第2点,其他几个特性和我们日常理解的大差不差,我将结合下面W3中的解释总结。

2.W3中的解释:

在这里插入图片描述
下面我们逐句理解:

2.1 sessionStorage特性代表了当前顶级浏览上下文指定的存储区域。每个顶层浏览上下文都有唯一的一套会话存储区域,其中每个源有一个会话存储区域

1. 顶级上下文
平时我们说的浏览上下文可以是一个标签页、一个窗口、一个iframe等。而顶级浏览上下文就是没有被嵌入到任何其他浏览上下文的浏览上下文,一般情况下,在浏览器中打开一个新的标签页或者窗口时,这个新的标签页或窗口就是一个顶级浏览上下文,而一个iframe被嵌入另一个文档中时,那这个iframe浏览上下文就不是顶级浏览上下文。平时开发中我们可能会通过比较window.top与window.self是否相等来判断当前浏览上下文是否时顶级上下文
2. 每个顶层浏览上下文都有唯一的一套会话存储区域,其中每个源有一个会话存储区域
由于一个顶级上下文中可能包含多个浏览上下文,所以它有一套会话存储区域,而每个源(同域)有一个会话存储区域。
那么是不是就可以理解为,如果在一个顶级浏览上下文中如果嵌套了两个同源的浏览上下文(如通过iframe),这两个浏览上下文是不是共享一个sessionStorage会话存储区域?
答案是肯定的
同样如果顶级浏览上下文和其嵌套的浏览上下文同源的话,其sessionStorage也是共享的。
注意这里提到的是共享,不是复制,他们不是相互独立的,而是使用的同一个存储区域。
这就可以回答文章开头的问题1和问题2,答案都是肯定的。

2.2

当一个新的Document在一个顶级浏览上下文中被创建时,用户代理必须检查该顶级浏览上下文在当前文档的源下,是否具有会话存储区域。如果有,那么这个存储区域就是这个Document分配的会话存储区域;如果没有,则会为该文档的源创建一个新的存储区域,并作为该Document分配的会话存储区域。一个Document分配的会话存储区域在其生命周期内是不会改变的——甚至在一个嵌套的浏览上下文(比如iframe)被移动到另一个父浏览上下文的时候。
结合2.1的内容,这句话就更容易理解了。当一个新的Document被创建时会先查找当前顶级浏览上下文中是否已经有同源的存储区域,如果已经有了就直接使用该区域,如果没有则新建一个存储区域。

最后回答下上面提到的问题3和4:

1.sessionStorage完全不能在两个窗口共享吗?
一般来说,在不同窗口sessionStorage是隔离的,互不影响。但是通过window.open(url,‘_blank’)在新窗口打开同域下的地址,新开的窗口会复制当前窗口的sessionStorage为新窗口的sessionStorage,但是后续两个窗口的sessionStorage互不影响。即新窗口使用了原来窗口的sessionStorage做初始化,使用方式如:
在这里插入图片描述

2.系统A通过iframe嵌入系统B时,系统B能否共享A的sessionStorage?

  1. 如果A和B是在同一个域名下
    B和A共享sessionStorage
  2. 如果A和B不同域
    则两者的sessionStorage独立,此时如果想想A共享B的sessionStorage,可以通过nginx代理的方式,来实现两者在一个域名下的效果。如:B在嵌入A是不使用绝对地址,而是使用一个自定义的前缀路径,nginx在根据这个前缀代理到实际的地址,举例:
location /database/ {
	proxy_pass http://192.168.12.188:32510/;
 }

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

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

相关文章

【SQL】直属部门

目录 题目 分析 代码 题目 表:Employee ------------------------ | Column Name | Type | ------------------------ | employee_id | int | | department_id | int | | primary_flag | varchar | ------------------------ 这张表的主键为 e…

【pyside6】添加应用图标

文章目录 什么是应用图标指定图标样式 什么是应用图标 这个图标就是应用图标: 默认图标是这样: 指定图标样式 app.setWindowIcon(QIcon("logo.png"))

深信服超融合平台Windows虚拟机磁盘在线扩容

深信服超融合版本: 该版本支持磁盘在线扩容,虚拟机无需重启,不影响业务。 本次扩容是为现有磁盘扩容,如果是新增磁盘也是一样的步骤,单独添加一块磁盘即可。 1、点击需要进行扩容的虚拟机名称 2、在控制台可以看到当…

Android经典实战之简化 Android 相机开发:CameraX 库的全面解析

本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点 CameraX 是 Android Jetpack 的一个组件库,旨在简化 Android 相机应用的开发。它提供了一系列易于使用的 API,支持从 An…

别怕!PMP考试难度全解析,助你一次过!

首先我得说,PMP考试,它难,也不是那么难。为啥这么说呢? 你看,PMP考试难,难在哪儿?就难在它那知识面太广了,就像个杂货铺,啥都得懂点儿。项目管理啊,得懂管理&…

【Hot100】LeetCode—543. 二叉树的直径

目录 1- 思路深搜——dfs 2- 实现⭐543. 二叉树的直径——题解思路 3- ACM 实现 原题连接:543. 二叉树的直径 1- 思路 深搜——dfs 递归三部曲 1- 递归参数和返回值 返回 public int depth(TreeNode root) 2- 终止条件 如果遇到 null,则返回 0 3- 递…

2024Go语言面试宝典Golang零基础实战项目面试八股力扣算法笔记等

2024最新Golang面试八股文,以及各种零基础全套实战项目,经典力扣算法题以及常见的面试题型,大厂面试题。go语言面试必备。包括GO基础类、GO并发编程、GO RUNTIME、微服务、容器技术、Redis、MySQL、Linux、缓存、网络和操作系统、消息队列、分…

USB3.2 摘录(六)

系列文章目录 USB3.2 摘录(一) USB3.2 摘录(二) USB3.2 摘录(三) USB3.2 摘录(四) USB3.2 摘录(五) USB3.2 摘录(六) 文章目录 系列文…

如何在VMwareWorkstation上安装的ESXi系统扩容存储

在做ESXi的相关实验的时候,需要扩容ESXi的存储,那么如何进行操作呢? 扩容VMwareWorkstation上虚拟机的存储 首先我们需要先扩容虚拟机上的存储(可不关闭虚拟机)按照图下所示,右键虚拟机,点击设…

PCL-基于RANSAC的平面拟合方法

基于RANSAC的平面拟合方法 一、简介二、实验代码三、实验结果 一、简介 随机采样一致性(Random sample consensus,RANSAC):RANSAC是一种鲁棒的模型拟合方法,它可以处理存在大量噪声和异常值的数据。在进行平面拟合时&…

Qt QTableWidgetItem.setFlags()

查看 Qt 官方地址 Qt Namespace | Qt Core 5.15.14 得到如下说明 默认值是 63,即如下表达式的值(位运算),表示可选择(1)、可编辑(2)、可拖拽(4)、可放入&…

Springboot查看版本和兼容的依賴

https://docs.spring.io/spring-boot/docs/2.7.18/reference/htmlsingle/#appendix-dependency-versions 如果需要查自己的版本,只需要修改2.7.18,因爲我的是2.7.18的版本。 然後如果你想查詢所兼容的其它依賴版本,可以打開頁面后直接search…

RK3588——网口实时传输视频

由于通过流媒体服务器传输画面延迟太高的问题,不知道是没有调试到合适的参数还是其他什么问题。诞生了这篇博客。 RK3588板端上接摄像头,采集画面,通过网口实时传输给上位机并显示。 第一代版本 RK3588代码 import cv2 import socket imp…

AI智能体:我用扣子给詹杜库做了一套超酷炫的手办

杀疯了! 在巴黎奥运会今日的男篮决赛中,库里开启了杀神模式。 末节关键时刻投中 4 记三分,直接带走比赛,看得我都跪了。 库里在 2012 年未能入选梦之队,2016 年 NBA 季后赛夺冠后太过疲惫,2021 年东京奥…

真实护网,看这一篇就够了!【护网行动】

如果一个白帽黑客没参过护网,那他可能要回炉重造了。那么网安领域最出名的护网是什么?12年攻防老手告诉你答案。 1.什么是护网? 护网行动是由机关单位主办的网络攻防比赛,一般是每年的6~9月份会举行,分为国家级、省级…

如何给两台机器集群设置VIP(虚拟IP)

原文链接:https://www.cnblogs.com/qianz/articles/16825567.html 一、环境准备 1.集群 IP部署 172.16.30.181是主节点,172.16.30.182是备节点,VIP是172.16.30.183 我是在openstack上搭建的集群,建议大家将需要用到的IP都固定到…

java多线程(五)线程间通信

线程间通信是并发编程中的一个重要概念,它允许多个线程之间交换信息或共享数据。 以下是几种常见的线程间通信方式及其示例: 1. 共享内存 共享内存是最基本的线程间通信方式。多个线程可以访问同一块内存区域,通过读写这块内存区域来实现数…

【问题解决】 PyAutoGUI was unable to import pyscreeze.

解决方案: 打开终端(winr 输入cmd回车)执行 pip install pyscreeze 再执行:pip install pillow

详解并掌握AXI4总线协议(四)、AXI4_FULL_SLAVE接口源码分析以及仿真验证

系列文章目录 详解并掌握AXI4总线协议(一)、AXI4-FULL接口介绍 详解并掌握AXI4总线协议(二)、AXI4_FULL_MASTER接口源码分析以及仿真验证 详解并掌握AXI4总线协议(三)、基于AXI4_FULL接口的BRAM读写仿真验…

免费好用!阿里这5款AI神器,太强了,打工人必备!(建议收藏)

大家好,我是程序员X小鹿,前互联网大厂程序员,自由职业2年,也一名 AIGC 爱好者,持续分享更多前沿的「AI 工具」和「AI副业玩法」,欢迎一起交流~ 《黑神话:悟空》太爆了!最近感觉都要被…