jQuery远程验证竞争条件

Posted

技术标签:

【中文标题】jQuery远程验证竞争条件【英文标题】:jQuery remote validation race condition 【发布时间】:2010-12-03 04:21:33 【问题描述】:

我在使用 jQuery 验证插件和远程验证规则时遇到问题,与 jQuery 表单插件结合使用。

所以我使用jQuery表单插件拦截表单提交,如果验证失败,则表单不提交。但是,如果远程规则已经被验证(等待来自服务器的回答),无论如何都会发送表单。

如果是在一切正常之前或之后,我对表单的其他规则也是如此。但如果我在远程规则的 GET 中间,那么 $('#myform').validate.form() 将返回 true,并提交表单。

所以代码看起来像这样:

$('#myform').ajaxForm(
   beforeSubmit: processRequest,
   success: processResponse,
   dataType: 'json'
 );

$('#myform').validate(
   rules: 
       onkeyup: false,
       title:  
           required: true,
           remote:  url: 'check_title.php' 
       
   
);

function processRequest(formData, jqForm, options) 
    if (!$('#myform').validate.form()) 
        // cancel the form submition
        return false;
   
   // do some stuff
   return true;

有没有办法强制等待等待远程验证?

或者我可以在验证规则中只保留“onsubmit: true”,所以我可以确保验证只在提交时发生,并在返回 validate().form() 值之前等待完成,但是这是我最后的手段。

【问题讨论】:

【参考方案1】:

我认为你认为你必须让远程验证等待是正确的,因为这听起来像是一个竞争条件

根据ajaxForm documentation可以传入标准的$.ajax参数

所以您可以尝试将async: false 传递给ajaxForm。这将导致远程调用阻塞(同步)。

【讨论】:

把它放在 ajaxForm 选项上是行不通的,因为在表单提交之前就调用了 processRequest。但这给了我在远程规则上尝试“async:false”的想法,它也可以采用 $.ajax 参数。它可以工作,但不是最佳的,因为表单中的每个 UI 交互都被阻止,直到验证结束,它似乎被冻结了。我宁愿只使用 'onsubmit: true' 作为验证选项。

以上是关于jQuery远程验证竞争条件的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 5.8 验证竞争条件

Linux内核竞争条件漏洞-导致远程代码执行

jQuery在单选按钮之间使用条件条件进行验证

使用 JQuery 验证插件进行条件验证

如何通过jQuery在Razor中返回具有某些条件的验证键?

复选框验证,如我同意条款和条件 jquery