7

私が正しければ、Session Storage はクライアント側に保存され、1 つのタブからのみアクセスできます。

セッションストレージに保存された情報をサーバーに送信するにはどうすればよいですか? そのためにCookieを使用できますが、2つのタブを開くと、2番目のタブでCookieが書き換えられます。

ありがとう

4

2 に答える 2

13

Storage オブジェクト (localStorage と sessionStorage の両方) は、同じページが開いているすべてのタブから利用できます。

ただし (一部のコメントではこれは正しくないと述べていますが、これはドキュメントの誤解です)、新しいタブを開くと、新しいストレージ オブジェクトが内部的に作成されます。これは最初のもののクローンなので、その時点での内容は同じです。

それらはその時点とは別に扱われますが、コード内の storage イベントをリッスンして同期します。

http://dev.w3.org/html5/webstorage/#the-sessionstorage-attributeから: (仕様は実装者に対応していることに注意してください)

既存のブラウジング コンテキストのクローンを作成して新しいトップレベルのブラウジング コンテキストを作成する場合、新しいブラウジング コンテキストは、元のセッション ストレージ領域と同じセッション ストレージ領域で開始する必要がありますが、その時点から、2 つのセットは互いに影響を与えずに別個のものと見なす必要があります。とにかく。[...] セッション ストレージ領域に関連付けられている Storage オブジェクト x で setItem()、removeItem()、および clear() メソッドが呼び出されると [...]、その Window オブジェクトの sessionStorage を持つすべての Document オブジェクトに対して属性の Storage オブジェクトが x 以外の同じストレージ領域に関連付けられている場合、ストレージ通知を送信します

つまり、アクティブなタブでストレージが変更されると、storageイベントが他のすべてのタブ (同じオリジン) に送信されますが、アクティブなタブは変更されているためもちろん必要ありません。 .

イベントを使用してkeyおよびフィールドを読み取り、現在非アクティブなnewValueタブのを更新します (イベントには もあります)。には、影響を受ける Storage オブジェクトが含まれています (ローカル ストレージとセッション ストレージの両方を使用する場合に役立ちます)。localSessionoldValuestorageArea

「1 つのドメイン」について - はい、同じデータは同じオリジン(スキーム、ドメイン、およびポート) でのみ利用できます。

サーバーへのデータ送信は完全に可能です。Storage に保存されているもの (セッションとローカル) はすべて文字列として保存されます。ただし、エンコードすることをお勧めします(すでに文字列として保存されているため、JSONは必要ありません)。f.ex を使用:

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

次に、フォーム、URL、または ajax の一部として送信します。

于 2013-05-28T16:10:16.337 に答える
0

sessionStorage は、1 つのタブではなく、1 つのドメインで使用できます。つまり、1 つのタブでページの情報を設定し、2 番目のタブでそれを読むことができます。すみません、こんな感じでした。しかし、そうではありません。これを機能させるには、localStorage または Cookie が必要です。

したがって、Cookie に保存することは実行可能なオプションですが、そうする場合、なぜ sessionStorage を使用しているのですか?

Ajax を介して sessionStorage の内容をサーバーに送信することもできます (ただし、送信できるのは文字列のみであるため、データを json に変換する必要があります)。

しかし、とにかくサーバーに情報を保存するのであれば、なぜ sessionStorage を使用しているのでしょうか? localStorage と sessionStorage の要点は、サーバーが知る必要のないユーザー固有の情報を保存することです。

于 2013-05-28T12:44:34.223 に答える