Я не мог найти жалоб на такое поведение и потратил целый день, чтобы выяснить проблему. Наконец, выяснилось, что причиной является ошибка в Tomcat, которая доступна в версиях с 6.0.20 по 6.0.28 ( Ошибка 49598 ).
Проблема в том, что и базовая авторизация Tomcat, и безопасность Spring заменяют сеанс во время запроса авторизации. Поскольку выход из системы делает недействительным сеанс, прямой запрос входа в систему после запуска обеих замен сеанса во время одной и той же обработки запроса. Но в результате ошибки заголовок Set-Cookie в ответе остается указывать на идентификатор сеанса, предоставленный Tomcat (который становится недействительным из-за безопасности Spring, поскольку он работает после). Итак, следующий запрос отправляет куки уже уничтоженной сессии. И сеанс, созданный Spring (который содержит подписанного пользователя), остается невостребованным.
Лучшее решение - Tomcat 6.0.29 :-).
Если у кого-то есть проблемы с обновлением Tomcat, есть 3 способа избежать ошибки:
Отключить замену сеанса Tomcat. Вы можете сделать это, настроив Valve в context.xml
<Valve className="org.apache.catalina.authenticator.BasicAuthenticator"
changeSessionIdOnAuthentication="false"/>
Отключить сессионную замену безопасности Spring при настройке security.xml.
<http ... session-fixation-protection="none">
.....
</http>
Обеспечить дополнительное перенаправление после выхода из системы. Таким образом, Tomcat будет кэшировать Принцип в сеансе во время запроса на вход.
Может быть, это защищает кого-то от сумасшествия, как я вчера :) 1025 *
С уважением,
Эдгар