Хранилище сеансов HTML5 отправляется на сервер

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

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

Спасибо


person Grégory    schedule 28.05.2013    source источник
comment
На ум приходят запросы ajax.   -  person Ja͢ck    schedule 28.05.2013


Ответы (2)


Объект Storage (как localStorage, так и sessionStorage) доступен на всех вкладках, на которых открыта одна и та же страница.

Однако (некоторые комментарии утверждают, что это неверно, но это неверное толкование документации), когда вы открываете новую вкладку, внутри создается новый объект хранилища. Это клон первого, поэтому содержание в этом месте такое же.

Они обрабатываются отдельно от этой точки, но вы синхронизируете их, прослушивая storage событие в вашем коде.

Из http://dev.w3.org/html5/webstorage/#the-sessionstorage-attribute: (обратите внимание, что спецификации относятся к разработчикам)

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

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

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

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

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

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

Затем отправьте его как часть формы, URL-адреса или с помощью ajax.

person Community    schedule 28.05.2013

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

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

Вы также можете отправить содержимое sessionStorage на сервер через Ajax (хотя вам придется преобразовать данные в json, поскольку вы можете отправлять только строки)

Но если вы все равно сохраняете информацию на сервере, зачем вы используете sessionStorage? Весь смысл localStorage и sessionStorage заключается в том, чтобы сохранять пользовательскую информацию, о которой сервер не должен знать.

person Johan    schedule 28.05.2013
comment
sessionStorage доступен для 1 домена, а не для 1 вкладки — Неправда: см. developer.mozilla.org/en-US/docs/Web/Guide/DOM/ — это глобальный объект (sessionStorage), который поддерживает область хранения, доступную для продолжительность сеанса страницы. Сеанс страницы длится до тех пор, пока открыт браузер, и сохраняется после перезагрузки и восстановления страницы. Открытие страницы в новой вкладке или окне приведет к запуску нового сеанса. - person Quentin; 28.05.2013
comment
Я исправлен, я думал, что будет использоваться один и тот же сеанс, если на одной странице открыты две или более вкладок. Я только что попробовал, и это не так. - person Johan; 28.05.2013