在每个AJAX调用中发送相同数据的正确方法

Proper way to send the same data in every AJAX call

本文关键字:数据 方法 AJAX 调用      更新时间:2023-09-26

我想创建一个基本AJAX设置,以便在每次AJAX调用时发送用户名和密码配置。我不是在讨论这是否是正确的方法,这是我的项目必须的,并且还有其他安全配置,所以…

我想使用jQuery.ajaxSetup(options)选项对象创建数据,但是当我为POST函数定义额外的数据时,数据对象将被覆盖。

注:我相信没有必要展示我做了什么或我的代码在哪里,等等。我希望问题本身是显而易见的。

你错了!在ajaxSetup中设置默认数据,然后在ajax调用本身中添加更多数据不会覆盖默认数据。

它是这样工作的

$.ajaxSetup({
    data: {
        username: "Bill Gates",
        password: "Nerdman"
    }
});
$.ajax({
    type: "get",
    url: "script.php",
    data: {
        id: 4,
        company: "Microsoft"
    }
});

最终URL将是script.php?username=Bill+Gates&password=Nerdman&id=4&company=Microsoft",使得在请求中发送的最终数据对象

data: {
    username: "Bill Gates",
    password: "Nerdman",
    id: 4,
    company: "Microsoft"
}

所以所有的数据将被发送,这与POST请求相同,所有的数据将被添加。

这里有一个,点击,检查控制台中的URL,所有添加的数据都在那里,因为数据对象是累积的,并且每次调用$.ajaxSetup都添加到,它永远不会被覆盖。

jQuery也提供了用于这种数据操作的预过滤器,可以在发送之前将数据添加到所有ajax调用中,只需编写一次代码,而不是在每次调用中使用beforeSend

var settings = {
    username: "Bill Gates",
    password: "Nerdman"
}
$.ajaxPrefilter(function (options, originalOptions, jqXHR) {
    options.data = $.param($.extend(originalOptions.data, settings))
});
// later
$.ajax({
    url  : 'something.php',
    data : {"more" : "data"} // the above settings will be added as well
});

您可以使用 beforeSend $.extend 为您的request添加额外的细节,如下所示:

$.ajax({
        url:'someurl',
        type:'POST',
        beforeSend: function(jqXHR, settings) {
              settings.data = $.extend(
                      settings.data, { 
                      //your new data here 
                      }
              );
              return true;
        }
        //other related things
})

您可以使用$.extend()向基本配置添加额外信息:

var defaultConfig = {username: "User", password: "Insecure Plain Password"};
$.ajax({
    url: 'launchMission.php',
    data: $.extend(defaultConfig, {missionId: 15, destroyUniverse: true})
});

不直接调用ajax方法,而是创建一个基本javascript函数,并让所有页面使用$.extend()扩展这个基本方法。在此基本文件中创建sendAjax方法,并将选项作为参数。然后将您的配置添加到该数据中,并进行ajax调用。在每个需要进行ajax调用的类中,调用sendAjax()方法并传入数据和选项

我想你会通过阅读jQuery找到答案。ajaxSetup的文档:

因此,我们强烈建议不要使用这个API。相反,可以在调用中显式地设置这些选项,或者定义一个简单的插件来这样做。

基本上,他们推荐的是围绕jQuery.ajax创建自己的包装器(可以是jQuery插件的形式,也可以不是)。