Я фиксирую данные для входа пользователя в таблицу db с идентификатором сеанса в столбце с уникальным ограничением, и получаю исключение уникального ограничения
Вы не должнысохранить сгенерированный Tomcat ID сеанса как уникальное ограничение в БД.Это не имеет никакого смысла.Идентификатор сеанса Tomcat уникален только во всех существующих активных сеансах.Спецификация сервлета не запрещает повторно использовать идентификатор сеанса с истекшим сроком для нового сеанса в некоторый момент, месяцы или годы спустя.С шестнадцатеричной строкой фиксированной длины в качестве идентификатора сеанса все возможные идентификаторы не являются «неограниченными».Вы не можете предотвратить его повторное использование для другого клиента в какой-то момент.
Я не понимаю, почему вы когда-либо сохраняли бы сгенерированный Tomcat ID сеанса в течение всей жизни БД.Вы должны удалить его из БД, когда он истек.Или вы должны решить свою проблему по-другому.Поскольку вы ничего не заявили о функциональных требованиях этого «решения», я не могу дать более подходящий ответ.Однако вот несколько советов:
Сделайте все наоборот: вставьте или выберите необходимые данные в / из БД, получите сгенерированный БД идентификатор и сохраните его в качестве атрибутаHttpSession
.Например, вошедший в систему идентификатор пользователя или только весь объект User
.
Или, если необходимо увеличить время жизни сеанса по умолчанию, например, параметр «Запомнить меня», тогда вы должны сгенерировать UUID самостоятельно (и проверить, если он еще не существует в БД) и использовать его в отдельном cookie.