调用j_spring_security_logout不起作用

car*_*ret 20 security spring logout

我正在尝试使用j_spring_security_logout设置我的应用程序的logut但由于某种原因它无法正常工作,我一直收到404错误.

我正在调用这样的函数:

<a href="<c:url value="/j_spring_security_logout"/>"><img border="0" id="logout" src="./img/logout.png" /></a>

我在WebContent/jsp/my应用程序主页面中,登录和注销页面在WebContent/login /中.

我还检查了Spring安全注销的其他帖子问题但是那里给出的解决方案对我不起作用.

在这里你可以看到我的web.xml

<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>
Run Code Online (Sandbox Code Playgroud)

这是我的spring-security.xml

<http auto-config="true">
    <intercept-url pattern="/*" access="ROLE_USER" />
    <form-login login-page="/login/login.jsp" 
                authentication-failure-url="/login/errorLogin.jsp"/>
    <logout logout-success-url="/" logout-url="/login/logout.jsp" />
</http>

<beans:bean id="myAuthenticationProvider" 
    class="myapp.web.authentication.WSAuthenticationProvider">
</beans:bean>

<authentication-manager>
    <authentication-provider ref="myAuthenticationProvider"/>
</authentication-manager>
Run Code Online (Sandbox Code Playgroud)

提前致谢.

Rav*_*avi 34

logout-url引用虚拟URL,您不需要具有该名称的任何资源.你可以这样做:

<logout logout-success-url="/" logout-url="/j_spring_security_logout" />
Run Code Online (Sandbox Code Playgroud)

和你的页面上的链接像这样

<c:url value="/j_spring_security_logout" var="logoutUrl" />
<a href="${logoutUrl}">Log Out</a>
Run Code Online (Sandbox Code Playgroud)

或这个:

<logout logout-success-url="/" logout-url="/logout" />
Run Code Online (Sandbox Code Playgroud)

和链接如下:

<c:url value="/logout" var="logoutUrl" />
<a href="${logoutUrl}">Log Out</a>
Run Code Online (Sandbox Code Playgroud)

你混合了这两个为什么你得到404错误.


小智 28

检查csrf是否已启用.如果启用了csrf,则需要使用post方法注销,将csrf标记添加为隐藏字段.然后使用JavaScript发布表单以注销


vim*_*hna 17

使用弹簧安全4注销必须通过表单按钮完成.CSRF令牌必须一起提交.j_spring_security_logout不再起作用.花了一天后我才开始工作.
第1步:在您的JSP页面中

<c:url var="logoutUrl" value="/logout"/>
<form action="${logoutUrl}" method="post">
    <input type="submit" value="Logout"/>
    <input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/>
</form>
Run Code Online (Sandbox Code Playgroud)

第2步

<security:http use-expressions="true">
<security:form-login login-page="/login" authentication-failure-url="/login?error=true" />
<security:logout logout-success-url="/login" invalidate-session="true" logout-url="/logout" />
</security:http>
Run Code Online (Sandbox Code Playgroud)

步骤3在登录控制器中

//Logout mapping
@RequestMapping("/logout")
public String showLoggedout(){
    return "logout";
}
Run Code Online (Sandbox Code Playgroud)

步骤4您必须有一个logout.jsp

重要的是看到它会在注销后登陆登录页面.

<security:form-login login-page="/login" authentication-failure-url="/login?error=true" />
Run Code Online (Sandbox Code Playgroud)

所以这个登录页面必须与login.jsp相对应的映射或者在控制器中映射的任何内容.