Имитировать сеансовые файлы cookie на мобильных сеансах?

Я с удивлением обнаружил, что мое представление о том, как файлы cookie сеанса ведут себя на мобильных устройствах, отменено реальностью.

В обычных настольных браузерах поведение заключается в сохранении файла cookie сеанса, пока активен сеанс браузера. Сеанс должен быть закрыт, если последнее окно/процесс браузера закрыто.

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

Я обнаружил на своем Sony Xperia Ray с Android 4, что cookie сеанса не истек, даже если я очистил процесс браузера. Но на устройстве Samsung Tablet это было бы. Я не знаю, как устройства iOS ведут себя таким образом.

Это проблема!? Что мне делать, чтобы обойти это?

В настоящее время я решил оставить файл cookie в течение одного дня. Но я не очень этому доволен. Должен ли я снизить срок службы? Возможно, до 8 часов?

Ответ 1

Было бы разумно, если бы вы пошли по пути HTML5 и использовали sessionStorage?

Таким образом, вы можете быть независимы от того, как разные устройства обрабатывают сеансы браузера, поскольку хранилище сеансов HTML5 является per-window, поэтому оно ограничено временем жизни окна браузера.

В основном все мобильные устройства поддерживают sessionStorage (см. здесь), и у вас может быть фреймворк/плагин, такой как jQuery-Session-Plugin (следуйте эта ссылка) обрабатывает данные сеанса для вас (и предоставляет резервные файлы cookie сеанса для старых браузеров, которые не поддерживают sessionStorage).

EDIT. Чтобы показать поведение 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});

Посмотрите на консоль. Вы увидите, что при запуске нового сеанса вашего браузера клиента ширина будет изменяться, а высота останется прежней (поскольку локальное хранилище - для домена).

Вот ссылка на jsfiddle

Ответ 2

Мое решение аналогичной проблемы заключалось в использовании document.referrer в сочетании с файлом cookie. Если пользователь перемещается внутри вашего сайта, продолжайте использовать файл cookie, если он существует, в противном случае истекает или заменяет файл cookie.

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

Ответ 3

Эта проблема не ограничивается мобильными устройствами. Файлы cookie сеанса могут продолжаться "навсегда" также в браузере на рабочем столе, если пользователь постоянно выбирает "восстановить предыдущий сеанс" (я усвоил этот трудный путь).

Клиентское решение для ограничения сеансов до одного дня:

Установите два файла cookie:

  • a (браузер) - cookie сеанса и
  • cookie, который истекает в середине ночи пользователя (например, в 4:00 или 5:00), между, например, 2 часами и 26 часами с момента его установки (в общем, он должен истечь в окне btw x и x + 24 часа)

Если EITHER cookie отсутствует, запустите новый сеанс и reset их обоих.

Чтобы установить второй файл cookie, вы можете использовать Date.getTimezoneOffset(). В качестве альтернативы, если вы можете надежно привязать пользователя к географическому местоположению, чтобы иметь хотя бы приблизительную оценку их долготы, вы можете использовать долготу, чтобы вычислить, когда ожидается "средняя ночь пользователя" (1 час 15 градусов долготы). Две возможности: по IP-адресу (знание страны может быть недостаточно: в таких странах, как США, вам нужен хотя бы государственный уровень), или используя информацию, предоставленную CDN, если вы используете ее.

Имейте в виду, что если что-то ДОЛЖНО истечь через какое-то время (например, сеанс на сервере), тогда вы не можете полагаться на файлы cookie, вы также должны проверить на стороне истечения срока действия.

Ответ 4

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

Вы можете попробовать подключиться к событию onbeforeunload и сделать сообщение для сервера, чтобы изменить срок действия файлов cookie или если cookie не является безопасным типом, а затем удалить его из java script.

Ответ 5

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

Возможно, стоит сохранить IP-адрес в данных сеанса и, возможно, в сочетании с последней доступной временной меткой - уничтожить/перезапустить сеанс, если IP-адрес изменится?

Очевидно, это предполагает, что клиент подключен через мобильную сеть, а не Wi-Fi.