网站建设推广优化,企业管理网站的来历,网站流量排名查询,怎么做网站导航栏最近在调试程序的时候无意间看到 cookie 的过期时间是 session#xff0c;这个 session 表示的是什么时候过期#xff1f;牵扯出来另一个存储方案 sessionStorage 存储的数据又是什么时候过期呢#xff1f;
在查找相关资料的时候总会看到会话结束的时候 cookie 会被清除这个 session 表示的是什么时候过期牵扯出来另一个存储方案 sessionStorage 存储的数据又是什么时候过期呢
在查找相关资料的时候总会看到会话结束的时候 cookie 会被清除当然 sessionStorage 内的数据也会在会话结束的时候被清除。
问题又来了会话是什么会话什么时候会结束
暂时抛开这些问题看看 sessionStorage 是怎么使用和之前的持久化存储方案 cookie 有什么不同。
Storage
Storage 是 Web Storage API 的接口localStorage 和 sessionStorage 都实现了这个接口所以这两个对象都有这个接口定义的属性和方法。 Storage.length只读 存储的数据项数量 Storage.key(n: number)返回存储的第 n 个键名 Storage.getItem(key: string)返回 key 对应的值 Storage.setItem(key: string, value: string)存储键和值如果存在则更新 Storage.clear()清空存储的所有数据
Storage 和 cookies
cookielocalStoragesessionStorage随 HTTP 发送是否否最大数据量4K5M5M失效时机自己定义 或 随着会话断开失效不清除不失效随着会话断开失效跨域限制是是是
下面是 MDN 对 sessionStorage 的描述 sessionStorage 属性允许你访问一个对应当前源的 session Storage 对象。它与 localStorage 相似不同之处在于 localStorage 里面存储的数据没有过期时间设置而存储在 sessionStorage 里面的数据在页面会话结束时会被清除。 页面会话在浏览器打开期间一直保持并且重新加载或恢复页面仍会保持原来的页面会话。 在新标签或窗口打开一个页面时会复制顶级浏览会话的上下文作为新会话的上下文这点和 session cookies 的运行方式不同。 打开多个相同的 URL 的 Tabs 页面会创建各自的 sessionStorage。 关闭对应浏览器窗口Window/ tab会清除对应的 sessionStorage。 上面的内容引用自MDN Window.sessionStorage
对于以上的引用内容有如下问题
什么是会话
我理解会话是两个实体之间的交流交流是一个过程无论从时间还是从内容都会表现成一个过程一段时间。例如从输入账户密码进入系统到退出系统就是一次会话的完成。TCP 的三次握手也创建了一次会话TCP 四次挥手关闭连接则关闭了会话。
重新加载或恢复页面什么是恢复页面
恢复页面就是浏览器窗口/tab 手动关闭或者意外关闭都是可以恢复的恢复之后这个页面的会话也会随之恢复。前提是浏览器程序没有被退出如果程序被退出了无论是手动退出还是意外退出 session storage 和 session cookies 都会被清除。
在新标签或窗口打开页面是在哪里打开的新窗口或页面复制顶级浏览会话之后两个会话就没有联系了吗
这里的打开新的标签/窗口指的是在当前页面触发的动作导致新窗口/tab 的打开。复制而来的会话session storage和之前的会话没有联系。
和 session cookies 的运作方式不同session cookies 的运作方式是什么
session cookies 的运作方式不是复制不同窗口/tab 同一域操作的 cookies 是同一个。
加载别的页面是否算是会话结束
不算会话结束因为当前 tab 再次加载对应的 url 的时候还是可以访问到对应的 sessionStorage。
为了解答上面的问题我的尝试如下 在域 http://www.xx.com:80 下写入数据sessionStorage.setItem(a, 1) 关闭当前 tab/窗口保持浏览器程序没有退出 历史记录 - 最近关闭的 tab - 刚才关闭的 tab sessionStorage.getItem(a)可以得到1
表明恢复的标签和之前的标签共享一个会话因为它们是同一个标签 当前标签加载其它域名例如 http://jd.com 在回来 http://www.xx.com:80 这时候可以通过 sessionStorage.getItem(a)得到值1
表明同一个标签同一个域会共享会话 在当前页面通过链接 a relopener target_blank hrefhttp://www.xx.com:80打开/a 。注意这里的ref属性一定要加上缺省则不会有效 在新开的 tab 下sessionStorage.getItem(a)可以得到得到值1 在新开的 tab 下sessionStorage.setItem(a, 2) 在原来的 tab 下sessionStorage.getItem(a)得到的还是 1
表明从当前域打开新的 tab/窗口会复制当前的会话作为新开页面的会话因为是复制出来的两个会话之间没有关联 关闭浏览器程序 再次打开浏览器并且恢复 tab不是新开 tab 打开同域页面 sessionStorage.getItem(a)得到的是 null 而不是1
表明关闭浏览器程序会结束会话
session cookies的失效
和 sessionStorage 的尝试一致对于 cookie 的过期时间是 session 也做了如上尝试得出的结论如下
在浏览器关闭的情况下 session cookies 才会被清除只是关闭相关 tab session cookies 还是存在在此打开对应域的链接还是会看到相应cookies。
补充
对于relnoopener的a标签打开的链接不会复制opener的sessionStorage 参考Feature: Stop cloning sessionStorage for windows opened with noopener。近期chrome浏览器修改了a标签rel属性缺省的默认值为noopener参考Feature: Anchor target_blank implies relnoopener by default。关于a标签的rel属性可以参数考HTML attribute: rel
参考
MDN Window.sessionStorage
MDN Storage
HTTP 会话原理解释与应用
sessionStorage 你可能会忽略的细节
实际中使用 Javascript 中 sessionStorage 的注意事项