tutorial sesiones mvc manejo ejemplo spring spring-security spring-3

spring - sesiones - Cómo realizar el cierre de sesión de forma programática en la primavera 3



spring security xml (1)

Tengo una configuración de primavera para cerrar sesión de la siguiente manera:

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

Ahora quiero hacer cierre de sesión programáticamente. Cómo puedo lograr esto en la primavera 3. Necesito cerrar la sesión desde uno de mis controladores, que tiene la siguiente def. y actualmente estoy haciendo algo así como seguir ... ¿Es esta una buena idea ...

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


Depende. Si su aplicación puede colocar al usuario desconectado en la página "se ha cerrado la sesión", esto puede estar bien. Pero no puede estar seguro de si su usuario realmente se cerrará la sesión (por ejemplo, si el navegador está suprimiendo el redireccionamiento).

Programáticamente puede cerrar la sesión de esta manera:

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); }

Como señaló @LateralFractal, si no ha cambiado los valores predeterminados de SecurityContextLogoutHandler (consulte https://github.com/spring-projects/spring-security/blob/3.2.x/web/src/main/java/org /springframework/security/web/authentication/logout/SecurityContextLogoutHandler.java#L96 ) puede reducir esto a

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

o incluso (aunque es un poco feo)

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

Consulte https://.com/a/9767869/1686330 para obtener información general sobre cómo obtener HttpServletRequest .