SessionStorage в браузере (область) или LocalStorage удаляется при выходе

Есть ли какой-нибудь механизм, который позволил бы мне обрабатывать значения на уровне браузера? Я имею в виду либо:

  • sessionStorage, что я могу получить доступ к значениям на ЛЮБОЙ вкладке в браузере (что-то вроде сеансов на стороне сервера)

  • localStorage, который будет удален в конце сеанса (при закрытии браузера, а не вкладки)

Например, видео запускается в плеере на одной вкладке. В таком хранилище хранится какой-то флаг. Когда пользователь открывает другую вкладку с тем же URL-адресом, приложение должно прочитать этот флаг и запретить воспроизведение видео. Конечно, его следует удалить при выходе, иначе флаг отключит все будущие запросы в этом браузере. Какие-либо предложения?


person Dalibor    schedule 08.12.2015    source источник
comment
Вы можете использовать localstorage для своих целей ... Просто очистите localstorage при закрытом окне браузера :) Основная задача здесь - обнаружить событие закрытия окна баузера ...   -  person AkshayJ    schedule 08.12.2015
comment
Как я могу установить, когда окно браузера закрыто? Я использую onunload, onbeforeunload ... но он срабатывает каждый раз, когда страница закрывается, поэтому все, что нужно сделать пользователю, это просмотреть во второй вкладке, и флаг будет удален. Есть ли какое-нибудь другое событие, которое можно использовать при закрытии окна браузера?   -  person Dalibor    schedule 08.12.2015
comment
Однако вам не нужно беспокоиться о том, когда весь браузер закрыт, только о том, когда закрыта вкладка, на которой воспроизводится видео. Используйте localStorage, чтобы сохранить флаг, предотвращающий воспроизведение видео на других вкладках, и добавьте событие onunload (или подобное) к TAB, воспроизводящей видео, которое сбрасывает флаг localStorage при закрытии этой вкладки.   -  person Ieuan Stanley    schedule 08.12.2015
comment
@IStanley: событие onunload не поддерживается кросс-браузером, а также происходит при обновлении страницы. Кроме того, из-за того же URL-адреса вы не можете узнать, когда очистить локальное хранилище.   -  person AkshayJ    schedule 08.12.2015
comment
Обновление не должно быть проблемой - вы хотите, чтобы он сбрасывал флаг при обновлении, иначе обновленная страница не сможет воспроизводить видео, поскольку флаг все равно будет установлен. Хороший момент на фронте загрузки, я посмотрю и посмотрю, какое событие наиболее поддерживаемое   -  person Ieuan Stanley    schedule 08.12.2015
comment
@IStanley: событие onbeforeunload может быть решением :)   -  person AkshayJ    schedule 08.12.2015
comment
Я посмотрел, кажется, сейчас оба одинаково поддерживаются. Я добавил подробности и ссылки к своему ответу.   -  person Ieuan Stanley    schedule 08.12.2015
comment
Спасибо обоим, но событие выгрузки не вариант, потому что: пользователь открывает вторую вкладку и пытается воспроизвести видео, но ему отказывают из-за флага в localStorage. Он просматривает, скажем, домашнюю страницу, и флаг сброшен (из-за события выгрузки). Он возвращается к плееру и проигрывает видео без авторизации.   -  person Dalibor    schedule 09.12.2015


Ответы (3)


данные каждой вкладки или окна могут быть сохранены / прочитаны в локальное / сессионное хранилище, но они ограничены только этим доменом.

Вопрос, который вы задали об обработке видео на двух вкладках, можно вытащить, но с этим очень сложно справиться, и я бы не советовал идти по этому пути! Вы можете периодически сохранять временные метки видео в хранилище браузера, но это также зависит от сервера, который отправляет видео в браузер, и вы можете вообще не предоставлять видео пользователю!

Для очистки данных при закрытии окна браузера, я думаю, для этого нет события, но есть событие для потери фокуса окна, так что вы можете использовать это, я думаю.

hth,

person Kresimir Pendic    schedule 08.12.2015
comment
Hvala Krešo i pozdrav :) - person Dalibor; 02.03.2021

Если требуется, чтобы это длилось до тех пор, пока открыто окно браузера, вы столкнетесь с повторяющимися проблемами, поскольку браузеры больше не работают на этом уровне - есть уровень вкладок и уровень домена (сохраняется, как файлы cookie ). Окно браузера - это просто набор вкладок, если вы специально не настроили свой браузер определенным образом (чтобы удалить файлы cookie и данные сеанса при закрытии и не передавать данные между экземплярами окна). Однако это настройка браузера (и даже не стандартная для разных браузеров), а не то, что вы можете контролировать на стороне клиента.

Если вы готовы рассмотреть некоторые альтернативы, которые обеспечат требуемый конечный результат, если не тем конкретным способом, который вы указали, прочтите:

Чтобы развернуть исходный комментарий AkshayJ, используйте localStorage, поскольку sessionStorage всегда зависит от вкладки (его нельзя использовать совместно).

Чтобы сбросить флаг, в рамках той же функциональности, которая устанавливает флаг, добавьте событие onunload на вкладку, воспроизводящую видео, которое очистит его, когда вкладка закрывается или расположение окна перемещается от видео. Это обеспечит большую функциональность, чем вы изначально запрашивали, потому что в вашем исходном случае пользователю придется полностью закрыть браузер, прежде чем он сможет снова воспроизвести видео, даже если вкладка, на которой воспроизводилось видео, давно исчезла или перешла на другая страница.

ОБНОВИТЬ:

Если безопасность / авторизация вокруг этого имеет первостепенное значение (а не просто желание остановить это случайно), то использование localStorage - совершенно неправильный подход - эти данные и их существование в конечном итоге контролируются пользователем. Они могут удалить его или настроить свой браузер так, чтобы экземпляры окон не обменивались данными, поэтому все, что им нужно сделать, это открыть новое окно, чтобы просмотреть ваше видео дважды одновременно. Решительный пользователь найдет способ обойти это за считанные минуты.

Если вы хотите полностью контролировать его, вы должны взять эту сторону домена, а не полагаться на хранилище браузера, и использовать какой-либо другой тег, например список текущих IP-адресов или какой-либо другой метод идентификации уникального пользователя, чтобы определить, видео можно воспроизводить или нет. Имейте в виду, что у вас могут возникнуть те же проблемы, что и раньше, относительно того, когда снимать флаг, будь то сторона браузера или сторона домена.

ОБНОВИТЬ:

re: какое событие использовать, похоже, что onunload и onbeforeunload полностью поддерживаются во всех распространенных браузерах (ref: Здесь и Здесь). В этом ответе рекомендуется использовать оба варианта, чтобы быть в безопасности.

ОБНОВИТЬ:

OP выразил беспокойство по поводу того, что события разгрузки ненадежны и что пользователь может навсегда остаться заблокированным, если что-то пойдет не так. Лично я не испытал здесь ненадежности, но если вы беспокоитесь, введите аспект тайм-аута. Попросите вкладку, воспроизводящую видео, обновлять флаг (где бы он ни был) с отметкой времени каждые 30 секунд / 1 минуту / что угодно. Затем, когда загружается новый экземпляр страницы, пусть он проверяет метку времени. если что-то произошло с существующей страницей, так что она заморозила и события выгрузки не запустились, метка времени будет устаревшей, потому что она также перестала обновляться, поэтому вам просто нужно проверить, устарела ли метка времени как проверка на присутствие.

person Ieuan Stanley    schedule 08.12.2015
comment
Спасибо, но я не думаю, что это сработает: пользователь открывает вторую вкладку и пытается воспроизвести видео, но ему отказывают из-за флага в localStorage. Он просматривает, скажем, домашнюю страницу, и флаг сброшен (из-за события выгрузки). Он возвращается к плееру и проигрывает видео без авторизации. Более того, я не хочу полагаться на что-то настолько хрупкое, как событие разгрузки; что, если флаг случайно остается в localStorage, и пользователь больше не может воспроизводить видео при следующем посещении сайта? - person Dalibor; 09.12.2015
comment
re: ваш комментарий, насколько я понимаю, это обязательное поведение? Теперь я не понимаю, при каких обстоятельствах вы хотите предотвратить воспроизведение видео. Конечно, если пользователь уходит от видео, ему разрешается воспроизвести его снова, иначе какая разница между этим и простым закрытием и повторным открытием своего браузера? Также имейте в виду, что экземпляры браузера могут быть настроены так, чтобы не использовать файлы cookie / localStorage, чтобы они могли просто открыть новое окно и обойти ... Я обновлю свой ответ по некоторым вопросам, касающимся этого. - person Ieuan Stanley; 09.12.2015
comment
Пожалуйста, прочтите мой первоначальный вопрос. Значение localStorage следует удалить в конце сеанса (закрытие браузера), как в сеансе сервера. Значение LocalStorage не должно удаляться при выходе со страницы. - person Dalibor; 09.12.2015
comment
Я понимаю это, но события onbrowserclose нет, потому что браузеры так не думают о своем содержимом. Есть вкладки и домены, которые сохраняются в той же степени, что и файлы cookie. Я пытаюсь предложить вам альтернативу, основанную на деталях требования. В случае с видео нет необходимости ждать закрытия браузера, если все, что вы хотите сделать, - это запретить пользователю воспроизводить видео более одного раза за раз. Фактически, вы можете запретить пользователю воспроизводить видео, даже если оно не открыто ни на одной из существующих вкладок. Это то, что вы хотите? - person Ieuan Stanley; 09.12.2015
comment
Спасибо. Меня все еще беспокоит, что когда пользователь перейдет на другую страницу во 2-й вкладке и вернется к плееру, он сможет играть в нее. - person Dalibor; 09.12.2015
comment
Я обновил свой ответ более подробно. localStorage выполнит эту работу, если вы хотите, чтобы это не происходило автоматически. Другими словами, вы действительно не хотите, чтобы это произошло, но если это произойдет, это не конец света. Если это крайне важно, то localStorage и sessionStorage недостаточно безопасны, потому что это данные пользователя, а не данные клиента. Пользователь может делать с ним все, что ему заблагорассудится, и вы ничего не можете с этим поделать. Боюсь, что если вы беспокоитесь о том, что кто-то обойдет вас, вам нужно будет изучить другие методы! - person Ieuan Stanley; 09.12.2015
comment
Я не боюсь обойти, вот сценарий: есть флаг, который активируется при запуске видео. Он хранится в localStorage. При событии разгрузки страницы плеера флаг снимается. Правильно? (Когда срабатывает событие выгрузки? Когда пользователь покидает страницу.) Пользователь открывает новую вкладку и переходит на страницу видео. Он заблокирован из-за флага. Он переходит с этой страницы на главную во 2-й вкладке (когда он уходит, запускается событие выгрузки и флаг снимается). Он возвращается на страницу видео (все, что находится на 2-й вкладке), и он может воспроизвести видео, потому что нет флаг больше. - person Dalibor; 09.12.2015
comment
Попался. Это не должно быть большой проблемой - вы можете добавить событие выгрузки только тогда, когда установлен флаг (что в любом случае является естественным подходом). Это означает, что он не будет присутствовать на вкладке, которая останавливается, когда находит существующий флаг. Вы можете удвоить безопасность с помощью подхода с использованием временных меток, поскольку вкладка воспроизведения автоматически обновит флаг после любого вашего интервала ожидания. Сделайте это достаточно коротким (секунда или около того, не слишком много времени), и флаг вернется к тому времени, когда пользователь перезагрузит страницу. - person Ieuan Stanley; 09.12.2015
comment
Я получил тебе балл за все хлопоты; однако я решил пойти с сеансами сервера. Даже в этом случае событие выгрузки будет прослушиваться также на 2-й вкладке, потому что флаг устанавливается, когда пользователь запрашивает там. Спасибо, в любом случае. - person Dalibor; 09.12.2015

В конце концов, я отказался от сеансов на стороне сервера, потому что они вызывали другие проблемы, и решил их с помощью этого рабочего процесса:

  • После загрузки страницы устанавливается значение localStorage, если оно не было раньше, а также флаг открытия проигрывателя на этой вкладке. Если localStorage уже установлен, флаг установлен в значение false.

  • Если флаг установлен, воспроизводить видео, в противном случае запретить.

  • При выгрузке страницы, только если установлен флаг (то есть, если пользователь открыл видео на этой вкладке), удалите значение localStorage.

$(function () {
    if (localStorage.playerTabOpened) {
        var dateNow = Date.now();
        var diffSinceLastTabOpened = (dateNow - localStorage.playerTabOpened) / 1000;
        // if playerTabOpened value was stored more than 1 day ago, delete it anyway because it could be left by chance
        if (diffSinceLastTabOpened > 86400) {
            localStorage.removeItem("playerTabOpened");
        };
    }
    if (!localStorage.playerTabOpened) {
        shared.playerTabOpenedHere = true;
        localStorage.setItem("playerTabOpened", Date.now());
    } else {
        shared.playerTabOpenedHere = false;
    }
});

$(window).on("beforeunload", function () {
    if (shared.playerTabOpenedHere) {
        localStorage.removeItem("playerTabOpened");
    }
});

if (shared.playerTabOpenedHere) {
    // play
} else {
    // throw error
}

person Dalibor    schedule 10.12.2015