1. 程式人生 > >[轉]sessionStorage在同一網站多個標籤頁內共享資料嗎?這取決於標籤頁如何開啟

[轉]sessionStorage在同一網站多個標籤頁內共享資料嗎?這取決於標籤頁如何開啟

-------------------------------------------------------

一直以來,我所以為的 sessionStorage 的生命週期是這樣的:在 sessionStorage 中儲存的資料會在當前瀏覽器的同一網站的多個標籤頁中共享,並在此網站的最後一個標籤頁被關閉後清除。注意:這是錯誤的。

我之所以會這麼認為,是因為我寫程式碼的時候,sessionStorage 給我的表現就是這樣的。

假設我們有一個 index.html

<!-- 使用一個新標籤頁開啟自身,並設定一個 sessionStorage -->
<a href="index.html" target="_blank" onclick="sessionStorage.setItem('j', 's')">
  open myself
</a>

接下來:

  1. 在瀏覽器中開啟這個 index.html,我們稱之為標籤頁 A。注意:需要用 http 協議開啟!例如 http://localhost/index.html
  2. 點選頁面上的連結,此時會彈出來標籤頁 B。
  3. 在標籤頁 B 中開啟控制檯並執行 sessionStorage.getItem('j')

控制檯會輸出 's',這說明標籤頁 A 和 B 共享了 sessionStorage 中的資料;接下來,先關閉這兩個標籤頁,然後再開啟一個標籤頁 C,再讀取一下 j 的值,得到的是 null

這看起來跟本文一開始的說法是一致的,但今天我遇到了一個奇怪的事情……

我們給上面的步驟新增第四步

  1. 在瀏覽器中開啟這個 index.html,我們稱之為標籤頁 A。注意:需要用 http 協議開啟!例如 http://localhost/index.html
  2. 點選頁面上的連結,此時會彈出來標籤頁 B。
  3. 在標籤頁 B 中開啟控制檯並執行 sessionStorage.getItem('j'),得到 's'
  4. 新建一個新標籤頁 D,然後在位址列內輸入 http://localhost/index.html 開啟同樣的頁面, 然後執行 sessionStorage.getItem('j') 。

按照我的預期,標籤頁 D 得到的應該還是 's',畢竟我認為 sessionStorage 的資料是在同一網站的多個標籤頁之間共享的。但是我錯了

,得到的結果是 null

發生了什麼?為什麼標籤頁 B 中得到的是 's',為什麼標籤頁 D 中卻是 null

細心的同學可能已經發現了,標籤頁 B 和標籤頁 D 之間唯一的不同就是它們被開啟的方式:標籤頁 B 是通過在標籤頁 A 中點選連結開啟的,但標籤頁 D 是在瀏覽器位址列輸入地址開啟的。

我趕緊上 MDN 查了一下,上面是這麼說的:

...data stored in sessionStorage gets cleared when the page session ends...Opening a page in a new tab or window will cause a new session to be initiated, which differs from how session cookies work.

所以現在我明白了:通過點選連結(或者用了 window.open)開啟的新標籤頁之間是屬於同一個 session 的,但新開一個標籤頁總是會初始化一個新的 session,即使網站是一樣的,它們也不屬於同一個 session。

相關推薦

[]sessionStorage同一網站標籤共享資料取決於標籤如何開啟

------------------------------------------------------- 一直以來,我所以為的 sessionStorage 的生命週期是這樣的:在 sessionStorage 中儲存的資料會在當前瀏覽器的同一網站的多個標籤頁中共

執行緒之間共享資料的方式

ps:由於最近的面試很多問題都涉及多執行緒,自己感覺以前學的還是太淺,再展開學學吧。 今天先從考的比較頻繁的“多執行緒共享資料”開始。 一.目標 談到多執行緒共享資料,理想情況下我們希望做到“同步”和“互斥”。這是目標我們暫且把它先放到這。 二.分類 多執行緒共

Python通過Manager方式實現無關聯程序共享資料

Python實現多程序間通訊的方式有很多種,例如佇列,管道等。但是這些方式只適用於多個程序都是源於同一個父程序的情況。如果多個程序不是源於同一個父程序,只能用共享記憶體,訊號量等方式,但是這些方式對於複雜的資料結構,例如Queue,dict,list等,使用起來比較麻煩,不夠靈活。Manager是一種較為高階

java併發-執行緒之執行緒之間共享資料(6)

多執行緒共享資料的方式: 1,如果每個執行緒執行的程式碼相同,可以使用同一個Runnable物件,這個Runnable物件中有那個共享資料,例如,賣票系統就可以這麼做。 2,如果每個執行緒執行的程式碼不同,這時候需要用不同的Runnable物件,例如,設計4個執行緒

【java併發】執行緒間共享資料

先看一個多執行緒間共享資料的問題: 設計四個執行緒,其中兩個執行緒每次對data增加1,另外兩個執行緒每次對data減少1。   從問題來看,很明顯涉及到了執行緒間通資料的共享,四個執行

6、執行緒的共享資料

1、方式 1,如果每個執行緒執行的程式碼相同,可以使用同一個Runnable物件,這個Runnable物件中有那個共享資料,例如,賣票系統就可以這麼做。 2,如果每個執行緒執行的程式碼不同,這時候需要用不同的Runnable物件,例如,設計4個執行緒。其中兩

執行緒之間共享資料的方式探討

例子:賣票:多個視窗同時賣這100張票,票就需要多個執行緒共享 a、如果每個執行緒執行的程式碼相同,可以使用同一個Runnable物件,這個物件中有共享資料。 賣票就可以這樣做,每個視窗都在做賣票任務,賣的票都是同一個資料。 b、如果每個執行緒執行的程式碼不同,就需要使用不

如何實現同一瀏覽器標籤之間的通訊(一)——localStorage

一、localStorage (1)localStorage是什麼? localStorage物件在修訂過的HTML5規範中作為持久儲存在客戶端資料的方案取代了globalStorage,是Stor

同一瀏覽器標籤之間的通訊(一)——localStorage

一、localStorage (1)localStorage是什麼? localStorage物件在修訂過的HTML5規範中作為持久儲存在客戶端資料的方案取代了globalStorage,是Storage的例項。 注意:要訪問一個localStorage物件,頁面必須來自同一

同一瀏覽器標籤之間的通訊(二)——cookie+setInterval

二、cookie  (1)cookie是什麼?  HTTP Cookie,通常直接叫做cookie,最初是在客戶端用於儲存回話資訊的。該標準要求伺服器對任意HTTP請求傳送Set-CookieHTTP頭作為相應的一部分,其中包含回話資訊。瀏覽器會儲存這樣的回話資訊,並在這之後

同一網站域名之間訪問共享資訊

1. ContextSingleListener package test; import javax.servlet.*;import javax.servlet.http.*;import java.io.*;import java.util.*;import or

】Mybatis傳參數(三種解決方案)

三種 方案 var nbsp myba rom name bsp 什麽 轉自: http://www.2cto.com/database/201409/338155.html 據我目前接觸到的傳多個參數的方案有三種。 第一種方案: DAO層的函數方法 Public

[] Spring Boot配置DataSource

pro img ssp 情況 每一個 所有 title 進行 rom [From] https://www.liaoxuefeng.com/article/001484212576147b1f07dc0ab9147a1a97662a0bd270c20000 Sprin

【K8S學習筆記】Part3:同一Pod中容器間使用共享卷進行通信

ash source net def exe tput stat policy container 本文將展示如何使用共享卷(Volume)來實現相同Pod中的兩個容器間通信。 註意:本文針對K8S的版本號為v1.9,其他版本可能會有少許不同。 0x00 準備工作 需要有一

ztree外掛同一頁面tree想要每個tree有獨立的點選事件

在同一個頁面如果有兩個tree,而且想要兩個tree的點選事件區別開來,需要設定獨立的一套setting和回撥函式,如下: //第一棵樹 var setting = { isSimpleData : true, //資料是否採用簡單 Ar

03-在tomcat部署網站網站

在Tomcat伺服器釋出兩個專案 CRM  OA server.xml配置檔案 <Context docBase="C:\crm" path="/crm" /> <Context docBase="C:\oa" path="/oa" /> <Host nam

同一頁面ajax請求後臺堵塞問題

有個小夥子告訴我,一個頁面上同時開啟多個ajax,向後臺請求資料,會被堵塞。 “因為是同一個會話。但如果在控制器上加上這個特性就可以了”,小夥子說。 //session只讀,避免同一會話中ses

在SSH框架中,持久層物件相互引用,從而引發分查詢中,查詢所得的持久化物件轉換為JSON字串報錯的原因及解決方案

引言: 使用EasyUI框架的小夥伴們都知道,在使用datagrid(資料表格)時,會傳入如一個URL,用於請求資料表格中的所顯示的資料: <!--建立一個空表格--> <table id="mytable"></table>

同一頁面swiper出現錯亂問題

第一次使用swiper出現的各種奇葩問題,搞得頭疼 1.同一頁面存在多個swiper時,不能以通用的id或者class為定位標準,容易出現同時找到多個物件的問題,需要確保id和class的唯一性                             2.動態建立swpie

Windows下Git賬號配置,同一電腦ssh-key的管理

這一篇文章是對上一篇文章《Git-TortoiseGit完整配置流程》的拓展,所以需要對上一篇文章有所瞭解,當然直接往下看也可以,其中也有一些提到一些基礎的操作。 本文以配置github.com