Я знаю, что у этого есть большой шанс быть отмеченным как дубликат, но не мог найти точно, что я ищу
Это общая проблема, и я уверен, что у нее есть четкое решение для лучшей практики
Фон
Одностраничное SaaS-приложение с множеством перетаскиваний, пользователь может взаимодействовать с ним без особой связи с сервером в течение некоторого времени.
Сеанс сервера содержит только пользовательский объект с использованием непостоянного файла cookie сеанса.
Сессия истекает на сервере через X часов
Некоторые вещи загружаются только при входе
проблема
- Пользователь работает над приложением, после чего пользователь не выходит из системы, просто держит браузер открытым
- Пользователь возвращается через более чем X часов (сессия недействительна на сервере)
- Пользователь взаимодействует с приложением без необходимости подключения к серверу (перетаскивает объекты, редактирует текст ...)
- Только при следующем взаимодействии с сервером (предположим, что автосохранение отсутствует) пользователь попадает на страницу входа и теряет часть своей работы.
Возможные решения
Вот некоторые решения, которые я имею в виду, хотел бы услышать, есть ли какие-то другие, и есть ли какие-либо принципиальные проблемы с любым из них.
1. Никогда не выходите из системы
- Как? либо сохраняйте длинный сеанс, сохраняйте постоянный файл cookie, либо пинг "keep alive" с помощью javaScript
- Плюсы : пользователю не нужно ни о чем беспокоиться, он решает за него проблему
- Недостатки : не соответствует PCI, небезопасен и требует изменений в разработке, например, вещи, загруженные в сеанс только при входе пользователя в систему, должны быть перемещены либо в подмодель паба (прослушивание изменений события), либо в тайм-ауте кэша.
2. Локальное хранилище
- Как? использовать новое локальное хранилище для временного сохранения состояния в случае выхода из системы, перенаправления на страницу входа в систему, сохранения после входа в систему
- Плюсы : также база для поддержки работы в автономном режиме, а не только для обработки тайм-аута
- Минусы : сложнее в реализации, необходимо выполнить слияние состояний дерева данных, не все браузеры поддерживают
3. Автосохранение
Каждое пользовательское действие, которое меняет модель, должно сохраняться немедленно (или через какую-то очередь на стороне клиента), например, если они устанавливают флажок, изменяют текстовое поле или перетаскивают что-то, как только они сделаны, сохраняют изменения.
- Как? Используйте инфраструктуру MV ** (Backbone.js / Knockout.js / Ember.js / Angular.js и т. Д.), Чтобы связать модель и сохранить изменения.
- Плюсы : похоже на чистое решение, сеанс активен, пока пользователь активен, работа на стороне клиента не выполняется без его сохранения.
- Минусы : последнее действие, которое пользователь выполняет после истечения времени ожидания сеанса.
4. Выйдите из системы после окончания сеанса
это может иметь несколько подходов
Задать вопрос серверу «истек ли сеанс» - это что-то вроде уловки 22 / Кот Шредингера, так как простой вопрос к серверу продлевает сеанс (перезапускает тайм-аут),
- Как? Либо есть сервер, который поддерживает такой вопрос (я не знаю ни одного, но я пришел из земли Java), или можно просто сохранить таблицу идентификаторов сеансов и время последнего доступа вручную, и запросить сервер, передав сеанс Идентификатор в качестве параметра вместо cookie, я не уверен, что это вообще возможно, но это звучит опасно, небезопасно и плохо оформляет страницу whatsoever.login, сохраняется после входа в систему
- Плюсы : если была такая встроенная поддержка на серверах, звучит как чистый, законный вопрос (спрашивать, есть ли у пользователя X сеанс или нет, не обновляя его, если он это делает)
- Минусы : если сервер его не поддерживает (и опять же, я не знаю, есть ли у этой функции какой-либо сервер или фреймворк), то обходной путь потенциально может привести к огромным угрозам безопасности.
Один из обходных путей, о котором я слышал, это короткий сеанс на стороне сервера и поддерживающий пинг на стороне клиента, который имеет максимальное количество пингов
- Как? Короткий сеанс на сервере, клиент пингует каждый sessionTimeOut / 2, имеет максимальное количество попыток Y.
- Плюсы : вид исправляет проблему, быстро и грязно
- Минусы : ощущается как хак, обрабатывая обновление сессии самостоятельно, а не позволяя серверу делать это
Таймер на стороне клиента
Как? Имейте таймер на стороне клиента и синхронизируйте его с сервером, перезапуская его при каждом запросе, чтобы быть равным максимальному тайм-ауту сеанса сервера минус некоторое заполнение, после того как пользователь не отправляет какой-либо запрос на сервер, пользовательский интерфейс показывает, что «сеансы о времени ожидания, вы хотите продолжить? (как у вас на онлайн-банкинга)
Плюсы : исправляет проблему
- Минусы : не могу думать ни о чем, кроме необходимости убедиться, что синхронизация работает
Вопрос
Возможно, я что-то упустил в приведенном выше анализе, могут быть некоторые глупые ошибки, и я хотел бы, чтобы вы помогли исправить их. Какие еще решения я могу предложить для этого?
now
. 4.2 звучит как отличный способ убить ваш сервер и увеличить затраты. 4.3 На Android, когда я возвращаюсь на домашний экран, я почти уверен, что процесс приостановлен, и это также может помешать вашему клиентскому таймеру.