$.ajaxPrefilter覆盖请求正文



我想为ajax请求的所有请求体添加一个csrf令牌。我发现以下帖子很有用:jQuery将CSRF令牌添加到所有$.post()请求';数据

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

出于某种原因,此ovewrite请求正文。我不明白为什么。当我序列化请求主体时,我可以看到它的全部,但当它提交时,主体只包含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 });
    }
});

因此,我们不修改原始对象并添加值,也不将param字符串转换回对象以重新解析它,而是对要发送的新值进行参数化,并将其附加到param字符串中,前提是processData为true,contentType设置为默认值(以避免损坏其他内容类型)

最新更新