AjaxSubmit在发送前覆盖表单字段

AjaxSubmit在发送前覆盖表单字段,ajax,jquery,jqueryform,Ajax,Jquery,Jqueryform,在使用AjaxSubmit函数在Jquery上提交表单之前,我想覆盖“password”字段的值。 我知道我可以只更新输入字段上的值,但我不希望用户看到这种转换。换句话说,我只想向密码字段发送一个自定义值,并将当前值保留在屏幕上 我怎么能这么做 我当前的代码: var loginoptions = { success: mySuccessFuction, dataType: 'json' } $('#My_login_form').submit(function(e) {

在使用AjaxSubmit函数在Jquery上提交表单之前,我想覆盖“password”字段的值。 我知道我可以只更新输入字段上的值,但我不希望用户看到这种转换。换句话说,我只想向密码字段发送一个自定义值,并将当前值保留在屏幕上

我怎么能这么做

我当前的代码:

var loginoptions = { 
    success: mySuccessFuction, 
    dataType: 'json'
}

$('#My_login_form').submit(function(e) {
    e.preventDefault();
    var pass=$("#My_login_form_password").val();
    if (pass.length>0){
        loginoptions.data={
            password: ($.sha1($("#My_login_form_csrf").val()+$.sha1(pass)))
        }
    $("#My_login_form").ajaxSubmit(loginoptions);
    delete loginoptions.data;
});

这段代码的问题是,它发送了一个带有表单字段值的“password”POST变量,以及一个带有我在“loginoptions.data”上设置的值的重复变量。

如果您想这样做,那么我想您可以使用回调函数
beforesmit:function(contentArray,$form,options){}

  beforeSubmit: function(contentArray, $form, options){ 
    for(var i=0; i<contentArray.length; i++){
      if(contentArray[i].name == "password") {
        contentArray[i].value = ($.sha1($("#My_login_form_csrf").val()+$.sha1(pass)))
      } 
    }
  }
beforeSubmit:函数(contentArray,$form,options){

对于(var i=0;i似乎ajaxSubmit在表单上使用了jquery的serialize()函数,然后添加了额外的序列化数据。因此,如果我有一个名为“password”的字段,其值为“1234”,然后尝试使用“loginoptions.data.password”将其更改为“abcd”,它将序列化所有内容并放入“options.data”像这样:

"password=1234&field_2=value_2&password=abcd"
经过多次尝试,我放弃了使用ajaxSubmit函数,决定使用ajax函数提交表单:

var the_form=$('form#My_login_form');
loginoptions.url=the_form.attr("action");
loginoptions.type=the_form.attr("method");
var serializedForm=decodeURIComponent(the_form.serialize());
loginoptions.data=serializedForm.deserializeToObject();
var pass=$("#My_login_form_password").val();
    if (pass.length>0){
        loginoptions.data.password= ($.sha1($("#My_login_form_csrf").val()+$.sha1(pass)));
    }
$.ajax(loginoptions);
以下是反序列化对象()函数的功能:

function deserializeToObject (){
    var result = {};
    this.replace(
        new RegExp("([^?=&]+)(=([^&]*))?", "g"),
        function($0, $1, $2, $3) { result[$1] = $3; }
    )
    return result;
}

String.prototype.deserializeToObject = deserializeToObject;

基于克里斯蒂亚诺的回答,我能够实现这一点。如果使用
:beforesmit()
,则更改的值不会发布,但如果使用
:beforeSerialize()
,则会发布更改的值

         $('#ff').ajaxForm({
            beforeSerialize:function(jqForm, options){
                var serializedForm = decodeURIComponent(jqForm.serialize());
                options.data = serializedForm.deserializeToObject();
                options.data.tPassword = MD5($("#tPassword").val())     
            },
            success:function(data){
               // do stuff
            }
         });

您可以只使用jQuery.post而不是ajaxform插件。这样您就可以更好地控制发送的数据。我认为您不需要对密码客户端进行散列。对于mtim攻击,无论您发送的是清晰密码还是仅仅散列密码,都没有区别。在任何情况下,您都需要对密码服务器端进行散列和加密。大多数情况下,它是无论如何,使用现有的身份验证模块更安全。我更喜欢使用ajaxSubmit函数,但是,如果没有办法,我想我会将其更改为post has you say and Bdrew。@Christoph我正在为每个表单请求生成一个salt(csrf)。发送的密码是哈希(密码)+哈希(salt)的结果每个请求都不同。它仍然容易受到MITM攻击吗?是的。这没有区别,攻击者可以获得密码或散列,这样他就可以使用密码或散列向服务器进行身份验证。如果你真的担心安全问题,你需要使用SSL。如果你不担心,可以发送t他输入密码并在服务器端执行所有安全操作(哈希、超时等)。它不起作用…如果我为contentArray制作一个console.log,它显示的很好,但是当我看到请求时,它没有应用更改…现在只显示密码,没有更改。哦,尝试检查并修改,
选项。数据
而不是
contentArray
,可能它起作用了。如果我制作了“console.log”(options.data);“它给了我“未定义的”,但是,如果我使用“console.log(options);”,我可以在options.data中看到一个序列化的字符串……我不记得那个方法。我想也许它可以在将来的版本中添加到插件中?