22

我正在尝试使用 j_spring_security_logout 设置我的应用程序的注销,但由于某种原因它不起作用,我不断收到 404 错误。

我这样调用函数:

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

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

我还检查了 Spring security 的 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>

提前致谢。

4

6 回答 6

36

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 错误的原因。

于 2012-06-16T08:23:59.933 回答
29

检查是否启用了 csrf。如果启用 csrf,需要使用 post 方法注销,添加 csrf token 作为隐藏字段。然后使用 JavaScript 发布表单以注销

于 2014-06-05T08:10:32.697 回答
19

使用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 或任何映射到你的控制器中。

于 2016-03-26T20:00:16.790 回答
0

这也是你的控制器应该是什么样子的

@RequestMapping("/logout")
    public String logoutUrl(){
        return "logout";
    }
于 2016-07-08T00:32:25.600 回答
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>
于 2016-10-16T19:26:42.690 回答
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 generate logout url

于 2016-12-14T18:21:14.327 回答