Вам нужно отладить ваши настройки. Сценарий довольно прост: если пользователь успешно прошел аутентификацию, он имеет SecurityContext, доступный в текущем потоке (доступный через SecurityContextHolder). Если после исключения нет доступного SecurityContext для текущего потока, что-то должно быть удалено, заменено или очищено. Это легко выяснить с помощью отладки доступа к HttpSession и SecurityContextHolder. Дополнительная область, которую стоит проверить, - это какой экземпляр SecurityContextHolderStrategy используется - глобальный, TLS или наследуемый TLS.
тображении исключения на страницу 404 теги Spring Security не могут найти информацию аутентификации из контекста безопасности. С «настоящим» 404 аутентификация найдена.
Мой web.xml:
<error-page>
<exception-type>com.example.NotFoundException</exception-type>
<location>/app/404</location>
</error-page>
<error-page>
<error-code>404</error-code>
<location>/app/404</location>
</error-page>
На JSP у меня есть:
<sec:authorize access="hasRole('ROLE_USER')">
<%-- Show navigation links --%>
</sec:authorize>
<sec:authorize access="isAnonymous()">
<%-- Show login form --%>
</sec:authorize>
/app/404
путь сопоставлен с контроллером, который просто возвращает представление. Когда я просматриваю/foo/some_invalid_id
NotFoundException
выдается из контроллера и, наконец, когда он идет в JSP, он не может найти аутентификацию вSecurityContext
и не предоставляет ни один из двух вариантов. Вместо этого, когда я просматриваю/something_that_really_doesnt_exist
он может выяснить, вошел я в систему или нет, и отображает правильный HTML.