$ .ajaxPrefilter会覆盖请求正文

时间:2015-11-30 20:29:25

标签: jquery ajax

我想为ajax请求的所有请求主体添加一个csrf标记。 我发现以下帖子很有用:jQuery add CSRF token to all $.post() requests' data

$.ajaxPrefilter(function (options, originalOptions, jqXHR) {
    options.data = $.param($.extend(originalOptions.data, { c: csrf }));
});

由于某种原因,这会超出请求体。我不懂为什么。我可以看到我在那里序列化请求主体的所有内容,但是当它提交主体时只包含c字段。注意我使用jQuery的serialize()方法创建表单数据可能会有所帮助。

1 个答案:

答案 0 :(得分:1)

您找到的代码无法正常工作,因为它是专门为处理作为对象而不是param字符串传递的数据而构建的。

然而,实现此目标的更简单方法不会受到数据传递方式的影响:

$.ajaxPrefilter(function (options, originalOptions, jqXHR) {
    if (options.processData && options.contentType === 'application/x-www-form-urlencoded; charset=UTF-8') {
        options.data = (options.data ? options.data + '&' : '') + $.param({ c: csrf });
    }
});

因此,我们不是修改原始对象并添加值,或者将param字符串转换回对象只是为了重新解析它,而是将我们想要发送的新值包装起来并将其附加到param字符串中, processData为true,并且contentType设置为default(以避免损坏其他内容类型。)