Я пытаюсь написать пользовательскую страницу ошибок для ошибок, таких как 403 (доступ запрещен) и 500 (внутренняя ошибка сервера).Они будут отображаться из шаблона Velocity, и все сообщения будут переведены с использованием языка пользователя.Аутентификация и разрешение локали прекрасно работает в приложении.
Я установил местоположение в web.xml как желаемую страницу, а в webmvc-context.xml я добавил контроллер для просмотра запросов через.
Проблема, с которой я столкнулся, заключается в том, что SecurityContextHolder.getContext (). GetAuthentication () возвращает нулевое значение в представлении страницы ошибки.Глядя на журнал, я увидел:
06.10 14:42:26 DEBUG - context.HttpSessionSecurityContextRepository(HttpSessionSecurityContextRepository.java:351) - - SecurityContext stored to HttpSession: 'org.springframework.security.core.context.SecurityContextImpl@ece7b0b7: Authentication: ...
06.10 14:42:26 DEBUG - context.SecurityContextPersistenceFilter(SecurityContextPersistenceFilter.java:89) - - SecurityContextHolder now cleared, as request processing completed
06.10 14:42:26 DEBUG - servlet.DispatcherServlet(DispatcherServlet.java:691) - - DispatcherServlet with name 'foo' processing GET request for [/foo/app/error/403.html]
Так что Spring или Tomcat перенаправляют на страницу с ошибкой и жест запроса завершается, поэтому контекст очищается.И новый «запрос» не подвергается фильтрам Spring Security, поэтому не восстанавливает контекст.
Обычный способ не работает, но кажется, что информация аутентификации находится где-то в сеансе, в том числе из-за AbstractTemplateViewрегистрирует следующее:
Exposing session attribute 'SPRING_SECURITY_CONTEXT' with value [org.springframework.security.core.context.SecurityContextImpl@edfbd958: Authentication: org.springframework.security.web.authentication.preauth.PreAuthenticatedAuthenticationToken@edfbd958...
Как правильно получить, чтобы и обычные страницы, и страницы ошибок работали одинаково?