我正在使用django-rest-framework。
我必须在每个jquery ajax发送之前添加X-CSRFToken
标头。
参考:https://docs.djangoproject.com/en/1.8/ref/csrf/#ajax
jQuery.ajaxSetup({
beforeSend: function(xhr, settings) {
if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
xhr.setRequestHeader("X-CSRFToken", Cookies.get('csrftoken'));
}
}
});
所以,一切都很顺利,直到我使用beforeSend设置进行ajax调用:
jQuery.ajax({
url: '...',
data: { ... },
beforeSend: function(xhr, settings) {
// This function do shadows the ajaxSetup one.
}
});
那么,有没有有效的方法在jQuery.ajaxSetup
电话上级联beforeSend处理器?
答案 0 :(得分:1)
事实上,在jQuery Event的jQuery文档中,从beforeSend
来电或$.ajax
设置$.ajaxSetup
称为本地事件 ,但在目前的情况下,使用名为全球事件的$(document).ajaxSend()
更为合适。
如果您想在ajax send上添加多个全局事件处理器,请不要在$.ajaxSetup
上设置它。
ajaxSend
事件! http://api.jquery.com/ajaxSend/
所以代码可能如下:
function csrfSafeMethod(method) {
// these HTTP methods do not require CSRF protection
return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
}
$(document).ajaxSend(function(event, xhr, settings) {
if (!csrfSafeMethod(settings.type) && !settings.crossDomain) {
xhr.setRequestHeader("X-CSRFToken", Cookies.get('csrftoken'));
}
});
答案 1 :(得分:0)
如果在beforeSend
中定义新的$.ajaxSetup
注入,我可以级联前一个$.ajaxSetup
中定义的其他内容:
(function() {
function csrfSafeMethod(method) {
// these HTTP methods do not require CSRF protection
return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
}
var originBeforeSend = jQuery.ajaxSettings.beforeSend;
jQuery.ajaxSetup({
beforeSend: function(xhr, settings) {
// Call the previous beforeSend processor first.
if(originBeforeSend && originBeforeSend(xhr, settings) === false) {
return false;
}
if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
xhr.setRequestHeader("X-CSRFToken", Cookies.get('csrftoken'));
}
}
});
})();
但无论如何,如果我在beforeSend
电话中指定了另一个$.ajax()
,这种方式就没有运气。它仍然是阴影。