У меня есть некоторый код 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 больше не работает. Может ли это быть связано с переадресацией '/' с моего промежуточного ПО на конец пути URL, если это "GET" или "HEAD"?