Spring 4.x中需要CSRF令牌

时间:2017-02-11 12:54:25

标签: spring spring-security

我正在尝试从.js文件中发送隐藏的表单元素,因此它会进入控制器并在它之间抛出异常,CSRF令牌无效。

$(document.body).append(form);
            $(form).attr("action", "/controller_path");
            $(form).attr("method", "POST");
            var input = $("<input>").attr("type", "hidden").attr("name","payment_prim_customer").val(payment_prim_customer);

            $(form).append($(input));
            $(form).submit();

请建议如何处理?

我的.JSP文件中添加了CSRF令牌

<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}" />

2 个答案:

答案 0 :(得分:1)

在元标记中包含CSRF令牌。

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

最后试试这个:

$(document.body).append(form);
$(form).attr("action", "/controller_path");
$(form).attr("method", "POST");
var input = $("<input>").attr("type", "hidden").attr("name","payment_prim_customer").val(payment_prim_customer);
$(form).append($(input));

var token = $("meta[name='_csrf']").attr("content");
var header = $("meta[name='_csrf_header']").attr("content");
var csrf_input = $("<input>").attr("type", "hidden").attr("name",'_csrf').val(token);
$(form).append($(csrf_input ));

$(form).submit();

答案 1 :(得分:0)

因为您在Js中使用它,您可能需要使用csrfTokenRepository,然后从cookie中检索值。您可以在配置中添加类似的内容:

.and().csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse());

然后从名为X-XSRF-TOKEN

的cookie中检索令牌