环境:表达4,jquery,krakenjs,font-awesome
在controllers / products / index.js
中module.exports = function (router) {
router.post('/add',function(req,res){
// do something
});
};
在html文件中,用户点击图标并将产品添加到购物车
{?products}
{#products}
<ul id="{.id}">
<li class="add"><i class="fa fa-plus"></i></li>
</ul>
{/products}
{/products}
对于每个产品,以下脚本都是将ajax发布到后端。
$('.add').click(function(e){
var _id = this.parentElement.id;
$.ajax({
url: "/products/add",
type: 'POST',
contentType: 'application/json',
dataType: 'json',
data: JSON.stringify({
id: _id
})
});
});
然后,服务器响应500(内部服务器错误)并指出“错误:CSRF令牌不匹配”。我是否需要在ajax帖子中插入csrf令牌,或者在没有表单提交的情况下进行ajax调用时消除令牌验证。
答案 0 :(得分:3)
Krakenjs使用Lusca 保护crsf。
Lusca将crsf _token
存储在req.locals
。
此外,将视图中的crsf标记设置为hidden / data-attribute,并将其作为ajax帖子的一部分包含在内。
答案 1 :(得分:2)
你应该在你的ajax帖子中插入一个csrf令牌。
如果您使用快速csrf中间件,那么req
中会有一个变量,如req.csrfToken()
(使用csurf
中间件)或其他东西。
在输出html中打印此变量并使用javascript来获取它。
为了最佳实践,
答案 2 :(得分:0)
您需要在POST请求中添加带有正确TOKEN的标题“X-XSRF-TOKEN”。
这对我有用:
$.ajaxSetup({
beforeSend: function (xhr) {
xhr.setRequestHeader("X-XSRF-TOKEN", $cookies.get("XSRF-TOKEN"));
}
});
$.ajax({
type: "POST",
url: "/api/endpoint",
data: formData,
cache: false,
contentType: false,
processData: false,
success: function(data)
{
alert(data); // show response from the upload response.
}
});