【问题标题】:Call to j_spring_security_logout not working调用 j_spring_security_logout 不起作用
【发布时间】:2012-06-18 12:48:12
【问题描述】:

我正在尝试使用 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/ 中。

我还检查了其他帖子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>

提前致谢。

【问题讨论】:

    标签: spring security logout


    【解决方案1】:

    在基于 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

    【讨论】:

      【解决方案2】:

      先设置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>
      

      【讨论】:

      • 我实际上使用 AngularJS 作为前端,我必须使用 HTML 文件在 AngularJS 范围内注销用户。目前,我正在使用 ` Logout `在这种情况下,我该如何进行发布请求?
      【解决方案3】:

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

      @RequestMapping("/logout")
          public String logoutUrl(){
              return "logout";
          }
      

      【讨论】:

        【解决方案4】:

        使用 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";
        }
        

        第四步你必须有一个logout.jsp

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

        <security:form-login login-page="/login" authentication-failure-url="/login?error=true" />
        

        所以这个登录页面必须有相应的映射到 login.jsp 或任何映射到你的控制器中。

        【讨论】:

          【解决方案5】:

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

          【讨论】:

          • 嗨,我已经完成了 javascript 并传递了 csrf 令牌,但是一旦注销我就无法再次登录.. 注销后我的登录页面显示了一些 csrf 令牌,这与当我不同时重新加载登录页面,无法再次登录,提示http://192.168.6.51:8044/EWTS/auth/login_check;jsessionid=403A583CDDC688292408C7C76CD09F2D?targetUrl= not found
          • 哇,这为我节省了大量时间!谢谢!
          【解决方案6】:

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

          【讨论】:

          • 在 Java 配置中,您在SecurityConfig.java 中设置logoutUrl()。但除此之外,+1。这有帮助。
          猜你喜欢
          • 2017-04-14
          • 2014-12-09
          • 2012-02-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-16
          相关资源
          最近更新 更多