Симулировать сеансовые куки в мобильных сеансах?
На первый взгляд, я с удивлением обнаружил, что мои мысли о том, как сеансовые cookie-файлы ведут себя на мобильных устройствах, отвергаются реальностью.
В обычных браузерах настольных компьютеров поведение заключается в том, чтобы сохранять куки-файл сеанса, пока сеанс браузера активен. Сессия должна быть закрыта, если закрыто последнее окно / процесс браузера.
Теперь на мобильных устройствах вы почти не закрываете браузерное приложение, вы просто отправляете его в фоновый режим.
На моем Sony Xperia Ray с Android 4 я обнаружил, что срок действия файла cookie сеанса не истек, даже если я очищаю процесс браузера. Но на устройстве Samsung Tablet это было бы. Я не знаю, как ведут себя устройства iOS.
Это проблема!? Что я должен сделать, чтобы обойти это?
На данный момент я решил, что срок действия файла cookie истечет через один день. Но я не очень доволен этим.
Должен ли я снизить срок службы? Возможно до 8 часов?
5 ответов
Имеет ли для вас смысл перейти на HTML5 и использовать sessionStorage?
Таким образом, вы можете не зависеть от того, как разные устройства обрабатывают сеансы браузера, так как хранилище сеансов HTML5 зависит от окна, поэтому оно ограничено временем жизни окна браузера.
В основном все мобильные устройства поддерживают sessionStorage (см. Здесь), и у вас может быть фреймворк / плагин, такой как jQuery-Session-Plugin (перейдите по этой ссылке), который обрабатывает данные сеанса для вас (и предоставляет запасной вариант для файлов cookie сеанса для старых браузеров, которые не поддержка sessionStorage).
РЕДАКТИРОВАТЬ: Чтобы показать поведение sessionStorage по сравнению с localStorage, я создал скрипку, которая (для демонстрационных целей) использует sessionStorage для хранения ширины div и localStorage для хранения высоты того же div:
var randomWidth,
randomHeight;
if (!(randomWidth= $.session.get("randomWidth"))) { // assignment
randomWidth = Math.random() * 300;
$.session.set("randomWidth", randomWidth, true);
console.log("just assigned and stored in sessionStorage: randomWidth: " + randomWidth);
} else {
console.log("from sessionStorage: randomWidth: " + randomWidth);
}
if (!(randomHeight= $.domain.get("randomHeight"))) { // assignment
randomHeight = Math.random() * 300;
$.domain.set("randomHeight", randomHeight, true);
console.log("just assigned and stored in localStorage: randomHeight: " + randomHeight);
} else {
console.log("from localStorage: randomHeight: " + randomHeight);
}
$(".test").css({width: randomWidth, height: randomHeight});
Посмотри на консоль. Вы увидите, что когда вы начнете новый сеанс браузера вашего клиента, ширина будет меняться, а высота останется неизменной (потому что локальное хранилище для каждого домена).
Мое решение аналогичной проблемы было использовать document.referrer
в сочетании с печеньем. Если пользователь перемещается по вашему сайту, продолжайте использовать куки, если он существует, в противном случае истекает или заменить куки.
Проблема все еще существует, когда пользователь помещает браузер в фоновом режиме, хотя на вашем сайте, хотя. Если они возобновят просмотр и просто воспользуются ссылкой на вашем сайте, cookie все равно будет использоваться.
Эта проблема не ограничивается мобильными устройствами. Сессионные куки-файлы могут сохраняться "вечно" и в браузере настольного компьютера, если пользователь постоянно выбирает "восстановить предыдущую сессию" (я научился этому нелегко).
Клиентское решение для ограничения сессий до одного дня заключается в следующем:
Установите два куки:
- (браузерный) сеансовый файл cookie и
- файл cookie, срок действия которого истекает в середине ночи пользователя (например, в 4 или 5 часов утра), например, между 2 и 26 часами с момента его установки (в общем, срок его действия должен истекать в окне между x и х +24 часа)
Если ДРУГОЙ файл cookie отсутствует, начните новый сеанс и сбросьте их оба.
Чтобы установить второе печенье, вы можете использовать Date.getTimezoneOffset()
, В качестве альтернативы, если вы можете надежно определить местоположение пользователя, чтобы у вас была хотя бы приблизительная оценка его долготы, вы можете использовать долготу, чтобы рассчитать ожидаемую "середину ночи пользователя" (1 час - 15 градусов). долготы). Возможны два варианта: по IP-адресу (хотя знание страны может быть недостаточным: в таких странах, как США, вам нужен как минимум уровень штата), или с использованием информации, предоставленной CDN, если вы ее используете.
Имейте в виду, что если что-то ДОЛЖНО истечь через некоторое время (например, сеанс на сервере), то вы не можете полагаться на куки, вы должны также проверить на срок действия серверную часть.
Я хотел бы спросить пользователя, если хочет запомнить местоположение. Если не задано время ожидания файлов cookie для серверов. Вы дадите пользователю выбор выбрать пользовательский опыт.
Вы можете попробовать прикрепить к событию onbeforeunload и сделать сообщение на сервер, чтобы изменить срок действия файлов cookie или, если файл cookie не является безопасным, удалить его из сценария Java.
Это немного грязное предложение и ни в коем случае не доказательство - но я считаю, что стоит упомянуть. У меня никогда не было телефона, который оставался подключенным к Интернету в режиме ожидания (все они отключены для экономии заряда аккумулятора и прочего) - и мобильные сети очень быстро перерабатывают IP-адреса.
Может быть, стоит сохранить IP-адрес в данных сеанса и - возможно, в сочетании с отметкой времени последнего доступа - уничтожить / перезапустить сеанс, если IP-адрес изменяется?
Очевидно, это предполагает, что клиент подключен через мобильную сеть, а не Wi-Fi.