Как отследить, что пользователь перестал выполнять задачу?

Приложение на стеке Spring Boot, для хранения сессий используется Spring Session и Redis.

Есть пользователь. Он может начать проходить тест. Тест проходится в постоянном взаимодействии с сервером: пользователь получает вопрос, отправляет на сервер ответ и получает следующий вопрос. Когда тест кончится, надо записать результаты в БД. Пока тест не завершён, ответы пользователя должны храниться в сессии (сессия, напоминаю, хранится в Redis).

Пользователь может прервать тест, в частности:

  • Закрыть вкладку
  • Перейти по другому адресу со страницы теста
  • Нажать кнопку "Отменить тест"
  • Перезагрузить страницу

В этих случаях надо обнулять уже данные пользователем ответы, то есть откатывать тест. Для решения этой задачи мне на ум приходит только пингование, но и его с трудом понимаю, как его реализовать. Сессии, напоминаю, хранятся не в памяти, а в Redis.

Вопрос: как сделать сброс теста?


Ответы (1 шт):

Автор решения: Zhenyria

Решение нашлось довольно простое.

Когда тест создаётся, я генерирую уникальный ключ, по которому данные теста сохраняются в Redis. Этот же ключ я возвращаю клиенту, где он сохраняется в state. Когда клиент хочет дать ответ на следующий вопрос, то помимо самого ответа на сервер отсылается ещё и ключ из state. Redis при помощи этого ключа пытается найти запись с данными теста и, если запись отсутствует, возвращает ошибку.

После каждого запроса ключ обновляется (это нужно, чтобы сбрасывать TTL записи в Redis). Если пользователь закрывает вкладку / обновляет её, то state затирается, ключ исчезает, а с ним клиент теряет доступ к тесту. Поэтому пользователь вынужден начинать тест с самого начала.

→ Ссылка