【问题标题】:$.ajaxPrefilter overwrites request body$.ajaxPrefilter 覆盖请求正文
【发布时间】:2023-03-27 03:44:01
【问题描述】:

我想为 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() 方法创建表单数据。

【问题讨论】:

  • 可能是因为originalOptions.data 在使用 .serialize() 时是一个字符串。如果您改为使用一个对象,它将起作用。您也可以使用 .serializeArray(),但您必须修改预过滤器以添加属性,使其与 serializeArray 的输出相匹配。
  • 如果提供的数据不一致,这样的功能怎么可能工作
  • 测试它是否是一个字符串,如果是,将它转换回一个对象,添加你的参数,然后重新字符串化它。不过,祝 JSON 或 XML 帖子正文好运。

标签: jquery ajax


【解决方案1】:

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

但是,有一种更简单的方法可以实现这一目标,并且不会受到数据传入方式的影响:

$.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 设置为默认值(以避免破坏其他内容类型。)

【讨论】:

  • 我没有这样做,而是编写了一个 jquery 函数来将表单序列化为对象而不是字符串。如果 ajaxPrecheck 只是要反序列化它,为什么要将它序列化为字符串。不好的做法。
  • 是的。确实是不好的做法。请注意,您也可以切换到 serializeArray,并让前置过滤器区分 serializeArray 结构和普通对象结构,而不是引入 serializeObject 方法。
  • 如果您愿意,可以将其添加到您的答案中。我总是乐于接受更好的方法。
  • 我会,但是,我不记得从serializeArray返回的结构,已经好几年没用过了。
  • 等等……我们已经把事情复杂化了。 @r3wt
猜你喜欢
  • 1970-01-01
  • 2015-06-02
  • 2019-03-21
  • 1970-01-01
  • 2019-06-28
  • 1970-01-01
  • 2013-05-29
  • 2017-08-06
  • 1970-01-01
相关资源
最近更新 更多