vertical springutilities springlayout managers manager layouts ejemplo java spring-mvc spring-security

java - springutilities - Seguridad de primavera: 404 en cierre de sesión



swing java layout (3)

Cuando trato de acceder a la URL de cierre de sesión de mi aplicación Spring, aparece un error 404 y No mapping found for HTTP Request with URI [/logout] in DispatcherServlet with name ''mvc-dispatcher'' en el registro de mi servidor.

Ya he intentado Llamar a j_spring_security_logout que no funciona , Problema con el cierre de sesión de seguridad de Spring y casi todos los resultados relacionados en SO.

Incluyo los archivos de configuración completos, ya que la estructura xml de Spring todavía no está del todo clara.

Mi configuración de seguridad:

<beans:beans xmlns="http://www.springframework.org/schema/security" xmlns:beans="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security.xsd"> <http pattern="/resources/**" security="none" /> <http auto-config="true"> <intercept-url pattern="/login*" access="IS_AUTHENTICATED_ANONYMOUSLY" /> <intercept-url pattern="/**" access="ROLE_USER" /> <form-login login-page="/login" default-target-url="/"/> <logout logout-url="/logout" /> <csrf /> </http> <global-method-security secured-annotations="enabled" /> <authentication-manager> <authentication-provider user-service-ref="userDetailsService" /> </authentication-manager> </beans:beans>

Mi web.xml es este:

<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <display-name>XYZ</display-name> <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/spring/*-config.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <filter> <filter-name>springSecurityFilterChain</filter-name> <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> </filter> <filter-mapping> <filter-name>springSecurityFilterChain</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <servlet> <servlet-name>mvc-dispatcher</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>mvc-dispatcher</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>

¿Cómo hago para que la página de cierre de sesión funcione?


Para resolver esto, generalmente se requiere convertir un enlace de cierre de sesión en un botón de formulario POST con token CSRF oculto, que se puede lograr mediante:

<a href="#" onclick="document.getElementById(''logout-form'').submit();"> Logout </a> <form id="logout-form" action="<c:url value="/logout"/>" method="post"> <input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/> </form>



Tuve el mismo problema después de migrar de Spring 3.2 a 4, pero quería cerrar sesión usando un enlace en la vista.

La documentación de Spring ( http://docs.spring.io/spring-security/site/docs/current/reference/htmlsingle/#csrf-include-csrf-token-form ) explica cómo hacerlo en la vista.

Utilicé este fragmento de código en la JSP para hacer el cierre de sesión:

<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> <form:form action="${pageContext.request.contextPath}/logout" method="POST"> <input type="submit" value="Logout" /> </form:form>