Решение 1
Зарегистрируйте приложение в широком диапазоне ExeptionResolver , используя любое удобное вам значение.Например,
public class MyApplicationErrorResolver extends SimpleMappingExceptionResolver {
@Autowired
private List<LogoutHandler> logoutHandlers;
@Override
protected ModelAndView doResolveException(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex) {
if(ex instanceof AccessDeniedException) {
for(LogoutHandler lh : logoutHandlers) {
lh.logout(request, response, SecurityContextHolder.getContext().getAuthentication());
}
// Not present as a bean. So create it manually.
SecurityContextLogoutHandler logoutHandler = new SecurityContextLogoutHandler();
logoutHandler.setInvalidateHttpSession(true);
logoutHandler.logout(request, response, SecurityContextHolder.getContext().getAuthentication());
return new ModelAndView(new RedirectView(request.getRequestURL().toString()));
}
return super.doResolveException(request, response, handler, ex);
}
}
зарегистрируйте его как компонент:
<bean class="package.path.MyApplicationErrorResolver" />
(это все, что вам нужно, чтобы зарегистрировать его).Это будет работать для вашей конфигурации.Но вам, вероятно, потребуется удалить элемент <access-denied-handler>
из конфигурации.
Решение 2
Другой способ - использовать AccessDeniedHandler .Например:
public class MyAccessDeniedExceptionHandler implements AccessDeniedHandler {
@Autowired
private List<LogoutHandler> logoutHandlers;
@Override
public void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException accessDeniedException) throws IOException {
for(LogoutHandler lh : logoutHandlers) {
lh.logout(request, response, SecurityContextHolder.getContext().getAuthentication());
}
SecurityContextLogoutHandler logoutHandler = new SecurityContextLogoutHandler();
logoutHandler.setInvalidateHttpSession(true);
logoutHandler.logout(request, response, SecurityContextHolder.getContext().getAuthentication());
response.sendRedirect(request.getRequestURL().toString());
}
}
зарегистрируйте его как bean-компонент:
<bean id="accesssDeniedHandler" class="package.path.MyAccessDeniedExceptionHandler" />
и укажите его в вашей конфигурации:
<access-denied-handler ref="accesssDeniedHandler" />