我有一些jQuery代码,当我在页面上的模式中单击按钮时会触发该jQuery代码,以从页面中删除某些元素。这段代码在过去是有效的,但是一旦我添加了中间件来向GET
和HEAD
方法添加尾随斜杠,或者基于创建csrf的代码不相关,我就开始注意到问题。令牌和DELETE
触发器。我收到的错误是ForbiddenError: invalid csrf token
在触发模式的同一页面上,我有以下内容,因此我知道CSRF令牌存在,并且在我发布POST时,记录也会更新:
<form action="/app/blog/edit/2jVE2rGEmp/?_csrf=1POIam29-Psd35YjTfDzAKHnGDLxw8zaccccacURY" method="post" enctype="multipart/form-data" id="blogEditSubmission">
<input type="hidden" name="_csrf" value="1POIam29-Psd35YjTfDzAKHnGDLaccccacURY">
但是,正如我提到的,DELETE
方法存在于使用jQuery触发的模式中,并具有自己的csrf生成器。
//Call DELETE route for tag
$('#delete-tag-button').click(function(){
var CSRF_HEADER = 'X-CSRF-Token';
var setCSRFToken = function (securityToken) {
jQuery.ajaxPrefilter(function (options, _, xhr) {
if (!xhr.crossDomain) {
xhr.setRequestHeader(CSRF_HEADER, securityToken);
}
});
};
setCSRFToken($('input[name="_csrf"]').attr('value'));
var pathArray = window.location.pathname.split('/');
var blogId = pathArray[4];
var tagField = $('#tag-id').val();
$.ajax({
method: 'DELETE',
url: '/app/blog/' + blogId + '/tag/' + tagField + '/',
success: function(){
window.location.replace('/app/blog/edit/' + blogId);
},
error: function(error){
console.log(error);
}
});
});
在后端,我运行了以下中间件,这些中间件过去从来都不是问题:
//Set CSRF for Form Tokens
app.use(csrf());
app.use(function(req, res, next){
res.locals._csrf = req.csrfToken();
next();
});
是否有一些与众不同的地方可能是我的jQuery调用不再起作用的原因。如果是“ GET”或“ HEAD”,这是否可能与从中间件将“ /”重定向到URL路径的末尾有关?