У нашому додатку Django є такі вимоги до управління сеансом.
- Сесії закінчуються, коли користувач закриває веб-переглядач.
- Сесії закінчуються після періоду бездіяльності.
- Визначте, коли сеанс закінчується через неактивність, і покажіть користувачеві відповідне повідомлення.
- Попередити користувачів про наближається сеанс, який закінчується за кілька хвилин до закінчення періоду бездіяльності. Поряд із попередженням надайте користувачам можливість продовжити сеанс.
- Якщо користувач працює над тривалою діловою активністю в додатку, що не передбачає надсилання запитів на сервер, сеанс не повинен закінчуватися.
Прочитавши документацію, код Джанго та деякі публікації в блозі, пов’язані з цим, я придумав такий підхід до впровадження.
Вимога 1
Ця вимога легко реалізується, встановивши для SESSION_EXPIRE_AT_BROWSER_CLOSE значення True.
Вимога 2
Я побачив декілька рекомендацій використовувати SESSION_COOKIE_AGE для встановлення терміну закінчення сеансу. Але у цього методу є такі проблеми.
Сеанс завжди закінчується в кінці SESSION_COOKIE_AGE, навіть якщо користувач активно використовує додаток. (Це можна запобігти, встановивши термін дії сеансу на SESSION_COOKIE_AGE для кожного запиту за допомогою користувацького середнього програмного забезпечення або збереження сеансу для кожного запиту, встановивши SESSION_SAVE_EVERY_REQUEST на істинне. Але наступна проблема неминуча через використання SESSION_COOKIE_AGE.)
Завдяки тому, як працюють файли cookie, SESSION_EXPIRE_AT_BROWSER_CLOSE та SESSION_COOKIE_AGE є взаємовиключними, тобто термін дії файлу cookie закінчується під час закриття веб-переглядача або у вказаний час. Якщо використовується SESSION_COOKIE_AGE і користувач закриває веб-переглядач до закінчення терміну cookie, файл cookie зберігається, і повторне відкриття браузера дозволить користувачеві (або будь-кому іншому) ввійти в систему без повторної автентифікації.
Django покладається лише на певний файл cookie, щоб визначити, чи активний сеанс. Він не перевіряє дату закінчення сеансу, яку зберігає сеанс.
Наступний метод може бути використаний для реалізації цієї вимоги та вирішення проблем, згаданих вище.
- Не встановлюйте SESSION_COOKIE_AGE.
- Установіть дату закінчення сеансу як "поточний час + період бездіяльності" для кожного запиту.
- Перевизначте process_request у SessionMiddleware та перевірте, чи закінчується сеанс. Відмовтеся від сеансу, якщо термін його дії закінчився.
Вимога 3
Коли ми виявимо, що сеанс закінчився (у користувацькому SessionMiddleware вище), встановіть атрибут у запиті, щоб вказати закінчення сеансу. Цей атрибут може бути використаний для відображення відповідного повідомлення користувачеві.
Вимога 4
Використовуйте JavaScript для виявлення бездіяльності користувача, надання попередження, а також можливість продовження сеансу. Якщо користувач хоче продовжити, надішліть на сервер імпульс збереження живих, щоб продовжити сеанс.
Вимога 5
Використовуйте JavaScript для виявлення активності користувачів (під час тривалої ділової операції) та надсилайте збережені імпульси на сервер, щоб запобігти закінченню сеансу.
Вищеописаний підхід до впровадження здається дуже детальним, і мені було цікаво, чи може існувати простіший метод (особливо для вимоги 2).
Будь-яка інформація буде високо оцінена.