Несмотря на принятие ответа выше (спасибо Praveen за вашу помощь!), Единственное реальное решение, которое я нашел, это избегать поведения Spring по умолчанию logout-> login и использовать пользовательский обработчик Logout с новым выделенным JSP Logout выхода из системы,которая НЕ является страницей входа .Таким образом, я избежал перенаправления на страницу входа, у меня просто есть отдельная страница выхода - они больше не совпадают.Если пользователь хочет войти снова, он может ввести URL /app/login
, чтобы войти в систему.
Обработчик выхода из системы - это обычный обработчик контроллера (я назвал его myLogout),
@GetMapping("/participant/myLogout")
public String myLogout(HttpServletRequest request, HttpServletResponse response) throws Exception {
// Just for testing, the param is available:
System.out.println(request.getParameter("exitMsg");
// Manual logoff
CookieClearingLogoutHandler cookieClearingLogoutHandler = new CookieClearingLogoutHandler(AbstractRememberMeServices.SPRING_SECURITY_REMEMBER_ME_COOKIE_KEY);
SecurityContextLogoutHandler securityContextLogoutHandler = new SecurityContextLogoutHandler();
cookieClearingLogoutHandler.logout(request, response, null);
securityContextLogoutHandler.logout(request, response, null);
// My custom Logout JSP. No auto-redirects to Login
return LOGOUT_JSP;
}
И если вам нужен параметр, он есть как на сервере, так и на клиенте.сторона в JSP Logout:
`${param.exitMsg}`: --> Output: `test`.
Все предложения о том, как перенаправить на Login с параметром - будь то реализация CustomLogoutSuccessHandler
, такая как здесь или напрямую через перенаправление контроллеранапример здесь - не работает, если у вас есть требование «login-wall» для Spring Security Config
// ... special URLs listed here, then at the end:
.antMatchers("/participant/**").authenticated()
после вашего списка специальных разрешений.Это не работает, потому что Spring Security выполнит требование Login-Wall basic / login без параметров сначала , как только вы попытаетесь даже перенаправить на Login с параметром.И только тогда, после того как вы подтвердите свою подлинность, он будет использовать параметр перенаправления с параметром, например login?logout&exitMsg=...
.что ты просил.Другими словами, вы все равно потеряете параметр в вашем первом Требовании входа в стену, потому что вы уже вышли из системы.
Я не думаю, что мы должны избавляться от .authenticated()
в Config, потому что именно это создает защиту Login-Wall для всех запросов, что является важной функцией безопасности.Но когда он у вас есть, вы не можете передавать параметры в /login
, потому что базовая Login-Wall /login
с NO параметрами всегда будет в первую очередь.
Нет реального решения этой проблемы - и единственный способ, которым я это исправил, - это обойти все поведение по умолчанию и просто выделить отдельную страницу выхода из системы, полностью отличную от входа в систему.Это решение работает, и мне не нужно, чтобы страница входа снова отображалась сразу.