Jquery $.ajaxPrefilter覆盖请求正文

Jquery $.ajaxPrefilter覆盖请求正文,jquery,ajax,Jquery,Ajax,我想为ajax请求的所有请求体添加一个csrf令牌。 我发现以下帖子很有用: 出于某种原因,这将写入请求正文。我不明白为什么。我可以看到当我序列化请求主体时,它的所有内容都在那里,但是当它提交时,主体只包含c字段。请注意,我正在使用jQuery的serialize()方法创建表单数据,这可能会有所帮助。您找到的代码不起作用,因为它是专门为处理作为对象而不是参数字符串传入的数据而构建的 但是,有一种更容易实现此目标的方法,它不会受到数据传入方式的影响: $.ajaxPrefilter(functi

我想为ajax请求的所有请求体添加一个csrf令牌。 我发现以下帖子很有用:


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

您找到的代码不起作用,因为它是专门为处理作为对象而不是参数字符串传入的数据而构建的

但是,有一种更容易实现此目标的方法,它不会受到数据传入方式的影响:

$.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 });
    }
});

因此,我们不需要修改原始对象并添加值,也不需要将参数字符串转换回一个对象来重新解析它,而是只在processData为true且contentType设置为default(以避免损坏其他内容类型)的情况下,对要发送的新值进行参数化,并将其附加到参数字符串中

可能是因为使用.serialize()时,
originalOptions.data
是字符串。如果你改为使用一个对象,它会工作。您也可以使用.serializeArray(),但您必须修改预过滤器以添加属性,使其与serializeArray的输出相匹配。如果提供的数据不一致,这样的函数如何期望工作测试它是否是字符串,如果是,则将其转换回对象,添加参数,然后重新字符串化。不过JSON或XMLPostBody很好,我没有这么做,而是编写了一个jquery函数将表单序列化为一个对象,而不是字符串。如果ajaxPrecheck只是要取消序列化,为什么要将其序列化为字符串呢。坏习惯,是的。确实是坏习惯。请注意,您也可以切换到serializeArray,并让预过滤器区分serializeArray结构和普通对象结构,而不是引入serializeObject方法。如果您愿意,可以将其添加到您的答案中。我总是乐于接受更好的方法。我会的,但是,我不记得从序列化数组返回的结构,已经多年没有使用它了。等等。。。我们已经把事情复杂化了@r3wt
$.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 });
    }
});