Как выполнить выход из программы в spring 3

У меня есть конфигурация spring для выхода из системы следующим образом:

<logout logout-url="/abc/logout"
            logout-success-url="/abc/login"/>

Теперь я хочу сделать программный выход из системы. Как я могу достичь этого в spring 3. Мне нужно сделать выход из одного из моих контроллеров, у которого есть следующий def. и в настоящее время я делаю что-то вроде следующего... Это хорошая идея..

 public void suppressUserProfile() {
   //...
   return "redirect:/abc/logout"; 
 }

Ответ 1

Это зависит. Если это нормально для вашего приложения, чтобы вывести из системы пользователя на странице "вы были вышли из системы", это может быть нормально. Но вы не можете быть уверены, что ваш пользователь действительно выйдет из системы (например, если браузер подавляет перенаправление).

Программно вы можете выйти из системы следующим образом:

public void logout(HttpServletRequest request, HttpServletResponse response) {
        Authentication auth = SecurityContextHolder.getContext().getAuthentication();
          if (auth != null){    
             new SecurityContextLogoutHandler().logout(request, response, auth);
          }
        SecurityContextHolder.getContext().setAuthentication(null);
    }

Как отметил @LateralFractal, если вы не изменили значения по умолчанию SecurityContextLogoutHandler (см. https://github.com/spring-projects/spring-security/blob/3.2.x/web/src/main/java/org/springframework/security/web/authentication/logout/SecurityContextLogoutHandler.java#L96), вы можете сократите это до

public void logout(HttpServletRequest request) {
    new SecurityContextLogoutHandler().logout(request, null, null);
}

или даже (хотя это немного уродливо)

public void logout() {
    HttpServletRequest request =
        ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes())
            .getRequest();
    new SecurityContextLogoutHandler().logout(request, null, null);

См. fooobar.com/questions/692690/... для получения некоторого фона при получении HttpServletRequest.

Ответ 2

HttpSession session = request.getSession();
session.invalidate();
SecurityContextHolder.clearContext();