在javascript POST中发送CSRF令牌会产生错误

时间:2014-03-25 10:12:06

标签: javascript spring spring-security csrf csrf-protection

在我的网络应用程序中,我正在使用spring security 3.2.x ,我正在进行CSRF验证。在我的登录页面中,我已成功完成此操作。但在里面,我有一个按钮,按钮动作写在一个javascript

        $('#download').click(function(){

            var paramValue = '${params}';
            var params = $('#params_').clone()
            $('<form target="_blank" action="report" method="post"></form>').append(params).appendTo('body').submit().remove();

        });

现在问题是当我点击该按钮时出现以下错误

  

在请求参数'_csrf'或标题'X-CSRF-TOKEN'上找到无效的CSRF令牌'null'。

我认为这是因为无法发送CSRF令牌。任何人都可以告诉我如何解决这个问题。

提前致谢

2 个答案:

答案 0 :(得分:2)

是的,正如您所说,这是因为您动态创建的表单不包含有效的CSRF令牌输入。来自Spring Security documentation

$(function () {
  var token = $("meta[name='_csrf']").attr("content");
  var header = $("meta[name='_csrf_header']").attr("content");
  $(document).ajaxSend(function(e, xhr, options) {
    xhr.setRequestHeader(header, token);
  });
});

这将为您的ajax请求添加必需的标头。

答案 1 :(得分:1)

好的,我的问题出现在以下行中,我没有像普通表单提交的那样发送csrf令牌。

        $('<form target="_blank" action="report" method="post"></form>').append(params).appendTo('body').submit().remove();

所以我所做的就是创建了隐藏的字段并将其插入下面。

<script type="text/javascript">

    $(document).ready(function () {
    $('#download').click(function(){                

            var params = $('#params_').clone();
            var csrftoken = $("#csrftoken_").clone();
            $('<form target="_blank" action="report" method="post"></form>')
                .append(params)
                .append(csrftoken)
                .appendTo('body')
                .submit()
                .remove();

        });
    });
</script>

  <input type='hidden' id='params_' name='params' value='${params}' />
  <input type="hidden" id="csrftoken_" name="${_csrf.parameterName}" value="${_csrf.token}" /> 

这有效....