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