spring security 4.x 之后默认开启csrf保护,因此 POST, PUT or DELETE 等基本请求都要求附带服务器端的令牌请求才会被服务器接受,因此,如果你的POST, PUT or DELETE 等请求如果没有携带服务器令牌,你将会得到一个403错误"Invalid CSRF Token 'null' was found on the request parameter '_csrf' or header 'X-CSRF-TOKEN'."。
下面是解决方法:
在jsp头文件添加如下代码
<head>
<sec:csrfMetaTags/>
</head>
jsp编译之后的页面:
<head>
<meta name="_csrf_parameter" content="_csrf" />
<meta name="_csrf_header" content="X-CSRF-TOKEN" />
<meta name="_csrf" content="e62835df-f1a0-49ea-bce7-bf96f998119c" />
</head>
另外,ajax 的post请求也必须在请求头中手动添加参数:
var header = $("meta[name='_csrf_header']").attr("content");
var token = $("meta[name='_csrf']").attr("content");
$.ajax({
url: '/test',
type: 'POST',
beforeSend: function(xhr){
xhr.setRequestHeader(header, token);
},
success: function(data) {
console.log(data);
},
error: function (xhr, ajaxOptions, thrownError) {
console.log(xhr.status + ": " + thrownError);
}
});