2013-05-28 62 views
3

如果我是對的,會話存儲將存儲在客戶端,並且只能爲一個選項卡訪問。將HTML5會話存儲發送到服務器

如何將存儲在會話存儲中的信息發送到服務器?我可以使用cookie,但如果我打開2個選項卡,cookie將被第二個選項卡重寫。

由於

+0

ajax請求浮現在腦海。 –

回答

0

的sessionStorage可用於1個域,而不是1個標籤。因此,您可以在一個選項卡中的頁面上設置信息,並在第二個選項卡中將其讀出。對不起,我認爲它是這樣工作的。但事實並非如此,您需要使用localStorage或cookie才能正常工作。

因此,將它存儲在cookie中是一個可行的選擇,但如果你這樣做,爲什麼你甚至使用sessionStorage?

你也可以通過Ajax發送的sessionStorage的內容服務器,(但你必須將數據轉換成JSON,因爲你只能發送字符串)

但是,如果你在服務器上保存的信息呢,你爲什麼使用sessionStorage? localStorage和sessionStorage的重點是保存服務器不需要了解的用戶特定信息。

+2

* sessionStorage可用於1個域,而不是1個選項卡* - 不正確:請參閱https://developer.mozilla.org/en-US/docs/Web/Guide/DOM/Storage#sessionStorage - 這是一個全局對象( sessionStorage),它維護在頁面會話期間可用的存儲區域。只要瀏覽器處於打開狀態並且在頁面重新加載和恢復時存在,頁面會話就會持續。在新選項卡或窗口中打開頁面將導致啓動新的會話。 – Quentin

+0

我站在糾正,我認爲它會使用同一屆會議,如果有兩個或更多的標籤打開同一頁面。我只是嘗試了,情況並非如此。 – Johan

8

存儲對象(包括localStorage和sessionStorage)都可以從打開相同頁面的所有標籤中獲得。

但是(某些註釋表明這不正確,但這是對文檔的誤解),當您打開一個新選項卡時,將在內部創建一個新的存儲對象。這是第一個克隆,所以在這一點上的內容是相同的。

他們被分開處理,但通過在代碼中監聽storageevent來同步它們。

http://dev.w3.org/html5/webstorage/#the-sessionstorage-attribute:(注意規格正在解決的實施者)

當通過克隆 現有瀏覽上下文創建了一個新的頂級瀏覽上下文,新的瀏覽上下文必須 的開始與原來的會話存儲區相同,但兩套必須從 被認爲是分開的,互不影響 任何方式。 [...]在與會話 存儲區域[012],相關聯的存儲對象x上​​調用setItem(),removeItem()和clear()方法 ,窗口 對象的sessionStorage屬性的存儲對象與 相關聯的存儲區域相同,除了x,發送存儲通知

也就是說,當存儲在有源標籤被修改時,一個事件storage被髮送到所有其他標籤(對於相同的原點) - 但不是這當然是不需要的活動標籤因爲這是被修改的人。

使用event閱讀keynewValue領域,以更新目前不活躍選項卡(S)的localSession(也有個oldValue上的事件)。storageArea包含受影響的存儲對象(如果您同時使用本地存儲和會話存儲,則會很有用)。

至於「一個域名」 - 是的,只有相同的數據只能用於相同的原產地(方案,域名和端口)。

發送數據到服務器是完全可能的。存儲在存儲(會話和本地)中的所有內容都以字符串形式存儲。我會推薦編碼它(JSON是而不是,因爲它已經存儲爲一個字符串)。使用f.ex:

var dataForServer = encodeURIComponent(sessionStorage.getItem(myKey)); 

然後將其作爲表單,網址或ajax的一部分發送。