在我的网络应用程序中,我正在使用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令牌。任何人都可以告诉我如何解决这个问题。
提前致谢
答案 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}" />
这有效....