使用AJAX(Logout)的Spring安全发布请求

时间:2015-08-21 12:52:48

标签: jquery ajax spring spring-security

当我从Spring 3.1.1.RELEASE迁移到4.0.2 RELEASE时,我不得不对spring安全上下文进行一些更改。

除了POST退出请求外,几乎所有内容都可以。

我可以让整行成为form method =“POST”action =“logout”但是我必须处理提交,这是完全不同的造型然后我们需要的。 我尝试通过ajax发送带有csrf数据的注销请求但没有成功。 任何帮助是极大的赞赏。附:禁用csrf不是一种选择。

 <!-- JSP -->
 <meta name="_csrf" content="${_csrf.token}"/>
<!-- default header name is X-CSRF-TOKEN -->
<meta name="_csrf_header" content="${_csrf.headerName}"/>

<!--Anchor -->
<a id="loggg" href="logout">Logout1</a>

<!-- jquery -->
$("#loggg").click(function(e){
    e.preventDefault();
     var token = $("meta[name='_csrf']").attr("content");
      var header = $("meta[name='_csrf_header']").attr("content");
    $.ajax({
        url : "logout",
        method : "POST",
        data :token ,
        success : function(data) { 
            console.log("clicked");
        }, 
        error : function(data) {
            console.log(data);
        }
    });

})

FireBug开发者控制台返回:

403 Forbidden 2ms
"NetworkError: 403 Forbidden - http://localhost:8081/nekretnine/logout"
Object { readyState=4,  responseText="<!DOCTYPE html><html> 
<he...EASE</h3></body></html>",  status=403,  more...}

2 个答案:

答案 0 :(得分:1)

如果 login 是来自同一页面的AJAX请求,则会更改服务器中的令牌。在登录注销等事件中的Spring Security changes the token

因此,页面中的令牌不再有效。

如果情况确实如此,一种方法是在将令牌作为cookie附加过滤器之后使用GET请求获取新令牌,如here所述。

This也可能会有所帮助。

答案 1 :(得分:1)

我设法部分解决了这个问题。这个答案适用于那些可能遇到同样问题的人,就像我从Spring Security 3.1.1迁移到Spring security 4.0.2时那样。

JSP

 <meta name="_csrf" content="${_csrf.token}"/>
 <!-- default header name is X-CSRF-TOKEN -->
 <meta name="_csrf_header" content="${_csrf.headerName}"/>

<a id="loggg" href="logout">Logout1</a>

Jquery的

$("#loggg").click(function(e){
    e.preventDefault();
     var token = $("meta[name='_csrf']").attr("content");
      var header = $("meta[name='_csrf_header']").attr("content");
    $.ajax({
        url : 'logout',
        type : 'POST',
        data: token,
        beforeSend:function(xhr){
             xhr.setRequestHeader(header, token);
        },
        success : function(data) { 
            window.location ="/home";    here is the only problem, for some reason after logging out page doesnt refresh and i can still see myself logged in. Then i usually just press f5 and i am logged out.
        }, 
        error : function(data) {
            console.log(data);
        }
    });

})

当我从Spring security 3更改为Spring Security 4时,我注意到几个问题。 以下是一些:

属性不再是j.username i j.password而是use- username password

  1. 行动不再是j_spring_security_check,而是使用 - login
  2. 注销操作不再是j_spring_security_logout使用注销
  3. 请求必须发布,即使是注销。
  4. 您需要添加CSRF令牌
  5. <input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/>

    表单,或者如果你使用spring表单,将自动添加csrf.token。你也可以用

    你需要添加这些过滤器(你必须在Spring安全过滤器之前添加它们)

    <filter>
            <display-name>springMultipartFilter</display-name>
                 <filter-name>springMultipartFilter</filter-name>
            <filter-class>org.springframework.web.multipart.support.MultipartFilter</filter-class>
        </filter>
        <filter-mapping>
                 <filter-name>springMultipartFilter</filter-name>
                 <url-pattern>/*</url-pattern>
        </filter-mapping>
    
    1. 您可能正在使用multipartResolver解析器bean,您需要将其更改为 <beans:bean id="filterMultipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <beans:property name="maxUploadSize" value="-1" />

    2. 此外,如果您已经完成了所有这些并且仍然无法使用commons-fileUpload上传文件,那么您(就像我自己)可能会将filterMultyPartResolver放在servlet-context中,这在以前的版本中运行得很好,现在没有编译错误你最终会走在一条不知道该做什么的死胡同。解决方案很简单,只需将bean移动到root-context.xml和voala!一切都很完美。

相关问题