Зарегистрировавшиеся в пользовательской сессии перемешались в Grails Spring Security на Tomcat

У меня есть приложение в Grails, использующее Spring-Security для управления пользователями и ролями. Поскольку последние несколько дней я сталкиваюсь со странной проблемой: когда один пользователь входит в систему в какой-то момент, он становится другим пользователем (смешивание сеансов).

Пример: пользователь A входит в систему, пользователь B входит в систему из другого браузера, при переходе через действия контроллера в некоторый случайный момент пользователь A становится пользователем B в системе пользователя A, также как и пользователь B.

Эта проблема в ПРОИЗВОДСТВЕ, а не в разработке.

Я нашел некоторые подобные случаи через Интернет, но ни одного из Grails. Spring Security / JSF / Hibernate Случайное угонение сеанса на Tomcat? этот похожий, но в jsf и упомянутом решении, похоже, не работает для меня. Другим примером является Session mixed - apache httpd с mod_jk, tomcat, spring security - данные, обслуживающие другого пользователя, но здесь проблема, похоже, из-за mod_jk, что не так для меня (я не использовал mod_jk).

Мои системные версии:

  • Версия Grails: 3.2.4
  • Groovy версия: 2.4.7
  • Версия JVM: 1.8.0_05
  • Версия сервера: Apache Tomcat/8.5.14
  • Версия JVM: 1.8.0_121-8u121-b13-0ubuntu1.16.04.2-b13

1 ответ

Решение

Наконец-то я нашел проблему.

Виновниками были интернет-провайдеры (в настоящее время найденные в Субису и Меркантиле в Непале). Они фактически кэшируют всю запрошенную страницу, и когда тот же URL-адрес запрашивается другим пользователем в течение определенного периода времени (несколько часов), при условии, что оба пользователя находятся в одной сети ISP, кэшированная страница будет отображаться следующему пользователю.

Как я нашел свою проблему: я сделал эксперимент. Во-первых, я вошел в систему с двумя разными пользователями на разных компьютерах в одном и том же ISP, я сразу обнаружил проблему. Затем я вышел из системы в этом интернет-провайдере, отключился от этого интернет-провайдера, подключился к другому интернет-провайдеру и вошел в систему. Теперь у меня был User1 в Computer1 в ISP1 и User2 в Computer2 в ISP2, даже после просмотра в течение получаса проблема не была найдена.

Как я это исправил: я сгенерировал уникальный uuid и добавил к каждой ссылке меню. Это делает каждый URL по-разному, прошло 4 дня, и проблема не была найдена ни разу. В некоторых меню я не ставлю уникальный uuid и все еще проблема, но не в тех, где я помещаю уникальную строку.

Другие вопросы по тегам