У меня есть веб-приложение Java, которое хранит некоторые данные в сеансе. Данные в сеансе изменяются, когда пользователь взаимодействует с приложением (например, поток управляется контроллером, каждый контроллер имеет несколько страниц формы, на каждой странице формы некоторые данные обновляются в сеансе, а поток переходит к следующей странице формы).
Проблема заключается в том, что некоторые пользователи открывают более одной вкладке для приложения, причем каждая вкладка имеет другой шаг в потоке. На этом этапе данные в сеансе перепутаны, так как вкладки используют один и тот же сеанс (приложение использует сеансы, управляемые cookie).
Говорить пользователям о том, чтобы использовать разные браузеры, чтобы не использовать один и тот же идентификатор сеанса (например, одно окно Firefox и одно окно IE), не является вариантом, так как в какой-то момент кто-то забудет это сделать и вместо этого использует вкладки, их данные.
Добавление некоторых проверок, которые обнаруживают, что другой поток запрашивается с другой вкладки, и отображать сообщение пользователю, говорящее, что это не разрешено, не является опцией ни с того момента, как он мочит пользователей, и мы не хотим, чтобы это было?: D
Дело в том, что использование другой вкладки полезно для пользователей, потому что они более эффективны в том, для чего они используют приложение, поэтому я сохраняю этот параметр. Но теперь вопрос: как лучше всего управлять данными сеанса для большего количества вкладок?
То, о чем я думал, заключалось в том, чтобы контроллер генерировал токен, когда он запускает поток, и передает этот токен на каждую страницу формы, которая, в свою очередь, отправляет его обратно, чтобы идентифицировать себя. Если другая вкладка запрашивает одно и то же действие контроллера, когда есть текущий поток, генерирует еще один токен и передает его.
В принципе, я хочу, чтобы в каждом потоке был токен, и внутри сеанса я просто не буду хранить один набор данных, но имею набор данных для каждого токена, а затем сопоставляю запросы на основе токена.
Теперь проблема в том, что для этого подхода потребуется много переписываний для приложения, и мне было интересно, есть ли наилучшая практика для управления такой ситуацией или кто-то может предложить другие подходы. Я открыт для идей.
Вы столкнулись с такой ситуацией? Как вы справились с этим?