Я знаю, що це великий шанс бути позначеним як дублікат, але я не зміг знайти саме те, що шукаю
Це поширена проблема, і я впевнений, що вона має чітко визначене найкраще рішення
Фон
Додаток SaaS на одній сторінці має багато перетягувань, користувач може взаємодіяти з ним без особливого спілкування з сервером протягом певного періоду часу
Сеанс сервера містить лише об’єкт користувача, використовуючи непостійний cookie сеансу
Сесія закінчується на сервері через X годин
Деякі речі завантажуються лише під час входу
Проблема
- Користувач працює над програмою, після завершення роботи користувач не виходить із системи, а залишає браузер відкритим
- Користувач повертається через більш ніж X години (сеанс недійсний на сервері)
- Користувач взаємодіє з додатком, не потребуючи підключення до сервера (перетягує речі, редагує текст ...)
- Тільки при наступній взаємодії з сервером (припустимо, немає автоматичного збереження) користувач перекидається на сторінку входу і втрачає частину своєї роботи
Можливі рішення
Ось декілька рішень, які я маю на увазі, я хотів би почути, чи є інші, і якщо з будь-яким із них є щось принципово не так.
1. Ніколи не виходити з користувача
- Як? або продовжуйте тривалий сеанс, зберігайте стійкий файл cookie або ping-javaScript "підтримуйте життя"
- Плюси : користувачеві не потрібно нічого турбуватися, виправляє проблему
- Мінуси : не сумісні з PCI, не захищені і не потребують змін у розробці, наприклад, речі, завантажені до сеансу лише у користувальницькому вході, потрібно перейти до під-моделі паб (прослуховування змін подій) або мати тайм-аут кешу.
2. Місцеве зберігання
- Як? використовувати нову локальну пам’ять, щоб тимчасово зберігати стан, якщо вийшли з системи, перенаправляєте на сторінку входу, зберігаєтеся після входу
- Плюси : Крім того, база для підтримки "робота в автономному режимі", а не просто обробки таймауту сеансу
- Мінуси : важче реалізувати, потрібно зробити злиття дерева даних, не всі браузери підтримують
3. Автозбереження
Кожна дія користувача, яка змінює модель, повинна зберігатися негайно (або через якусь чергову сторону клієнта), наприклад, якщо вони перевіряють прапорець, змінюють текстове поле або щось перетягують, як тільки вони будуть виконані, збережуть зміни.
- Як? Використовуйте рамку MV ** (Backbone.js / Knockout.js / Ember.js / Angular.js тощо), щоб прив'язати модель та наполягати на змінах.
- Плюси : здається, чисте рішення, сеанс активний доти, доки користувач активний, жодна робота клієнта не виконується без наполегливості.
- Мінуси : Останній користувач робить після втрати часу сеансу.
4. Вийдіть із користувача після закінчення сеансу
це може мати кілька підходів
Запитайте у сервера "термін дії сесії закінчився" - це дещо спіймана кішка 22 / Schrodinger's cat, оскільки просте запитання до сервера продовжує сеанс (перезапускає тайм-аут),
- Як? У вас може бути сервер, який підтримує таке питання (я не знаю жодного, але я прийшов із Java land), або можна просто зберегти таблицю ідентифікаторів сеансу та час останнього доступу вручну та запитати сервер, пройшовши сеанс Ідентифікатор як параметр замість файлу cookie, я не впевнений, чи це можливо, але це звучить небезпечно, невпевнено і поганий дизайн сторінки whatsoever.login, зберігається після входу в систему
- Плюси : Якщо на серверах була така підтримка, це звучить як чистий законний запитання (запитання, чи є у користувача X ще сеанс чи ні, не поновлюючи його, якщо він є)
- Мінуси : Якщо сервер не підтримує його (і знову ж таки, я не знаю, чи має якийсь сервер або фреймворк цю функціональність), тоді вирішення може мати величезні ризики для безпеки.
Я чув, що я вирішував це короткий сеанс на стороні сервера і невідкладний пінг на стороні клієнта, який містить максимальну кількість пінгів
- Як? Короткий сеанс на сервері, клієнт проводить кожну сесіюTimeOut / 2, має максимум спроб Y.
- Плюси : вигляд виправляє проблему, швидко та брудно
- Мінуси : Ви відчуваєте себе злому, обробляючи оновлення сесії самостійно, а не дозволяючи серверу це робити
Таймер на стороні клієнта
Як? Майте таймер на стороні клієнта та синхронізуйте його із сервером, перезавантаживши його під час кожного запиту, щоб він дорівнював максимальному тайм-ауту сеансу на сервері за вирахуванням деякої прокладки, після того як користувач не надсилає жодний запит на сервер, користувальницький інтерфейс показує "сеанси Ви хочете продовжити? " (як у вас в Інтернеті)
Плюси : виправляє проблему
- Мінуси : Не можу придумати жодного, крім необхідності переконатися, що синхронізація працює
Питання
Я, напевно, щось пропускаю у наведеному вище аналізі, можливо, є деякі нерозумні помилки, і я хотів би, щоб ваша допомога була їх виправити. Які інші рішення я можу мати для цього?
now
. 4.2 звучить як чудовий спосіб знищити ваш сервер та збільшити витрати 4.3 На андроїд, коли повертаєтесь на головний екран, я впевнений, що процес призупинено і це також може заважати вашому таймеру клієнтів.