我正在尝试使用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 /中。>
我还检查了其他帖子Problem with Spring security's logout,但那里给出的解决方案对我不起作用。
在这里你可以看到我的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>
这是我的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>
提前致谢。
答案 0 :(得分:34)
logout-url是指虚拟URL,您不需要具有该名称的任何资源。你可以这样做:
<logout logout-success-url="/" logout-url="/j_spring_security_logout" />
以及您网页上的链接
<c:url value="/j_spring_security_logout" var="logoutUrl" />
<a href="${logoutUrl}">Log Out</a>
或者这个:
<logout logout-success-url="/" logout-url="/logout" />
和链接如下:
<c:url value="/logout" var="logoutUrl" />
<a href="${logoutUrl}">Log Out</a>
你混合了这两个为什么你得到404错误。
答案 1 :(得分:27)
检查csrf是否已启用。如果启用了csrf,则需要使用post方法注销,将csrf标记添加为隐藏字段。然后使用JavaScript发布表单以注销
答案 2 :(得分:17)
使用 spring security 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>
第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>
第3步在您的登录控制器中
//Logout mapping
@RequestMapping("/logout")
public String showLoggedout(){
return "logout";
}
第4步您必须拥有一个logout.jsp
重要的是看到它会在注销后登陆登录页面。
<security:form-login login-page="/login" authentication-failure-url="/login?error=true" />
所以这个登录页面必须与login.jsp对应的mappping或你控制器中要映射的内容。
答案 3 :(得分:0)
还说明你的控制器应该是什么样的
@RequestMapping("/logout")
public String logoutUrl(){
return "logout";
}
答案 4 :(得分:0)
首先在security-context.xml中设置以下代码......
<security:logout logout-success-url="/"
invalidate-session="true" />
然后将此代码添加到您的jsp文件..
<script>
function formSubmit() {
document.getElementById("logoutForm").submit();
}
</script>
<c:url var="logoutUrl" value="/logout" />
<a href="javascript:formSubmit()"> Logout</a>
</li>
<form action="${logoutUrl}" method="post" id="logoutForm">
<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}" />
</form>
答案 5 :(得分:0)
在基于JAVA的Spring MVC配置中,您必须在安全配置类中配置它:
@Override
protected void configure(HttpSecurity http) throws Exception {
super.configure(http);
http.servletApi().rolePrefix("");
http
.logout()
.logoutRequestMatcher(new AntPathRequestMatcher("/logout"));
}
这个答案加倍,正在处理我的案例: Spring Security Java Config not generating logout url