Logout no está funcionando en Spring Security

Estoy escribiendo una aplicación de seguridad con Spring Security 4.0. Como parte de eso, quiero hacer una llamada de salida. Simplemente está dando el método de Solicitud ‘POST’ no soportado. Aquí está mi código:

spring-security.xml

     <!--  -->   

jsp

    

Si usa CSRF, tiene que usar HTTP POST (con una

en su JSP) en lugar de HTTP GET (con una en su JSP), consulte Spring Security Reference :

18.5.3 Cierre de sesión

Al agregar CSRF se actualizará LogoutFilter para usar solo HTTP POST. Esto garantiza que el cierre de sesión requiere un token CSRF y que un usuario malintencionado no puede cerrar la sesión de forma forzosa de sus usuarios.

Un enfoque es utilizar un formulario para cerrar sesión. Si realmente desea un enlace, puede usar JavaScript para que el enlace realice un POST (es decir, tal vez en un formulario oculto). Para los navegadores con JavaScript desactivado, puede hacer que el enlace lleve al usuario a una página de confirmación de cierre de sesión que realizará el POST.

Por ejemplo, vea Spring Security Reference :

37.5.1 Inclusión automática de fichas

Spring Security incluirá automáticamente el token CSRF dentro de los formularios que usan la etiqueta del formulario Spring MVC. Por ejemplo, el siguiente JSP:

             

También puede probar esto en su JSP porque creo que su JSP es incorrecta. Reemplace su código dado con el siguiente código:

 

En su caso, no está enviando un formulario, simplemente está realizando una solicitud de j_spring_security_logout a j_spring_security_logout pero requiere un token CSRF con una solicitud POST, por lo que devolverá el mensaje de error que está recibiendo.

Editar: deshaga los cambios que haya realizado de la respuesta anterior porque esto es solo una modificación de lo que ya tiene.

Resuelvo este problema en mi proyecto. El código de la siguiente manera:

  @RequestMapping(value="/j_spring_security_logout", method = RequestMethod.GET) public String logoutPage (HttpServletRequest request, HttpServletResponse response) { Authentication auth = SecurityContextHolder.getContext().getAuthentication(); if (auth != null){ new SecurityContextLogoutHandler().logout(request, response, auth); logger.info("logout ok"); } return "redirect";//You can redirect wherever you want, but generally it's a good practice to show login screen again. } 

No sé si puedes aceptarlo de esta manera. Si abre CSRF, debe usar la publicación para solicitar la url de cierre de sesión. En spring security4, el CSRF por defecto abierto. Estos documentos le darán más información. 18.5.3 Cierre de sesión 18.5.3 Cierre de sesión