2013-05-28 4 views
3

Если я прав, хранилище сеансов хранится на стороне клиента и доступно только для одной вкладки.Хранилище сеансов HTML5 отправляется на сервер

Как я могу отправить информацию, хранящуюся в хранилище сеансов на сервер? Я могу использовать cookie для этого, но если я открою 2 вкладки, cookie будет переписан на второй вкладке.

Благодаря

+0

Запросы ajax приходят на ум. –

ответ

0

sessionStorage для домена 1, а не 1 таб. Таким образом, вы устанавливаете информацию на странице на одной вкладке, и вы можете прочитать ее во второй. Извините, я думал, что это сработало. Но это не так, вам нужно localStorage или файлы cookie для этого.

Таким образом, сохранение его в файле cookie является жизнеспособным вариантом, но если вы это сделаете, то почему вы даже используете sessionStorage?

Вы также можете отправить содержимое sessionStorage на сервер через Ajax, (хотя вы должны преобразовать данные в формате 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: (обратите внимание, что данные адресуют реализаторы)

Когда новый контекст просмотра верхнего уровня создается путем клонирования существующего контекста просмотра, новый контекст просмотра должен начинаться с в те же области хранения сеанса, что и оригинал, но два набора должны с этой точки зрения считаться раздельными, не затрагивая друг друга в в любом случае. [...] Когда методы setItem(), removeItem() и clear() вызывают в объекте Х хранения, который связан с областью хранения [...], , то для каждого объекта документа, Окно Объект объекта objectStorage объекта хранения связан с той же областью хранения, кроме x, отправляет уведомление о хранении.

То есть, что, когда хранение модифицируется в активной вкладке, storage событие посылается на все остальные вкладки (для того же происхождения) - но не активной вкладки, которые, конечно, не нужен поскольку это тот, который изменяется.

Используйте event читать key и newValue поля для обновления localSession в настоящее время неактивной вкладки (ы) (есть также в oldValue на мероприятии).storageArea содержит объект хранения, на который влияет (полезно, если вы используете как локальное, так и хранилище сеансов).

Что касается "одного домена" - да, те же самые данные будут доступны только для того же происхождения (схема, домен и порт).

Отправка данных на сервер полностью возможна. Все, хранящиеся в хранилище (сеансовом и локальном), хранятся в виде строки. Я бы рекомендовал кодировать его, хотя (JSON не необходимо, поскольку он уже хранится в виде строки). Используйте f.ex:

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

Затем отправьте его как часть формы, url или ajax.

Смежные вопросы