Наше приложение Django имеет следующие требования к управлению сеансом.
- Сеансы истекают, когда пользователь закрывает браузер.
- Сеансы истекают после периода бездействия.
- Определять, когда срок действия сеанса истекает из-за бездействия, и отображать соответствующее сообщение для пользователя.
- Предупреждать пользователей о приближающемся истечении сеанса за несколько минут до окончания периода бездействия. Наряду с предупреждением предоставьте пользователям возможность продлить сеанс.
- Если пользователь выполняет длительную работу в приложении, не связанную с отправкой запросов на сервер, время ожидания сеанса не должно истекать. .
После прочтения документации, кода Django и некоторых сообщений в блогах, связанных с этим, я пришел к следующему подходу к реализации.
Требование 1< /strong>
Это требование легко реализовать, установив для параметра SESSION_EXPIRE_AT_BROWSER_CLOSE значение True.
Требование 2
Я видел несколько рекомендаций по использованию SESSION_COOKIE_AGE для установки срока действия сеанса. период. Но у этого метода есть следующие проблемы.
Сеанс всегда истекает в конце SESSION_COOKIE_AGE, даже если пользователь активно использует приложение. (Этого можно избежать, установив истечение срока действия сеанса до SESSION_COOKIE_AGE при каждом запросе с использованием специального промежуточного программного обеспечения или путем сохранения сеанса при каждом запросе путем установки SESSION_SAVE_EVERY_REQUEST в true. Но следующая проблема неизбежна из-за использования 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 для обнаруживать бездействие пользователя, предоставлять предупреждение, а также возможность продлить сеанс. Если пользователь желает продлить сеанс, отправьте на сервер импульс проверки активности, чтобы продлить сеанс.
Требования t 5
Используйте JavaScript для обнаружения активности пользователя (во время длительной бизнес-операции) и отправки импульсов подтверждения активности на сервер, чтобы предотвратить истечение срока действия сеанса.
Приведенный выше подход к реализации кажутся очень сложными, и мне было интересно, может ли быть более простой метод (особенно для требования 2).
Мы будем очень признательны за любую информацию.