当我尝试使用ajax加载部分页面时,我收到403错误
无效的CSRF令牌' null'在请求参数' _csrf'上找到或标题' X-CSRF-TOKEN'。
Spring Security FAQ告诉我们
如果HTTP POST返回HTTP 403 Forbidden,但适用于HTTP GET那么这个问题很可能与CSRF有关。要么提供 CSRF令牌或禁用CSRF保护(不推荐)。
那么,怎么做呢?
function getPage(url) {
$.ajax({
type: 'POST',
url: url,
data: {_csrf: "??"},
success: function (data) {
loadPage(url, data);
}
});
}
答案 0 :(得分:0)
您可以从存储在客户端的cookie中获取令牌。为此你必须使用像这样的cookie服务: https://www.npmjs.com/package/angular2-cookie
写一个这样的函数来获取令牌:
getCookie(){
return this._cookieService.get("token-name");
}
最后将令牌添加到请求标头:
doSomething(token){
var json = JSON.stringify({});
var headers = new Headers();
headers.append('Content-Type','application/json');
headers.append('token-name', token);
return this._http.post('http://localhost:8080/doSomething', json, {
headers: headers
}).map(res => res.text()
);
}
这解决了我的问题
答案 1 :(得分:-2)
在这里找到我自己的问题的答案: http://spring.io/blog/2013/08/21/spring-security-3-2-0-rc1-highlights-csrf-protection/
this - to html
<meta name="_csrf" content="${_csrf.token}"/>
<meta name="_csrf_header" content="${_csrf.headerName}"/>
this - to js
$(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);
});
});