在页面的POST提交请求时,如果不做特殊处理,用户刷新一次页面,就会导致重复提交一次。
在Ajax里面,这个问题也是尤为严重的,用户只要重复点击那个按钮一次,就会重复提交一次。很多人会说,加屏蔽层或者将按钮灰掉。好,这个对付普通用户是可以的,如果是恶意用户呢,自己构造请求,用程序来反复提交,会搞死人的。
通常,方法执行需要时间,一般比较短,但是某些和WebService打交道以及和读写文件打交道的方法,都是需要很长时间的。恰好,在这个方法里,有重要的逻辑。结果会很惨,用户不停地通过Ajax来调用这个方法,结果造成严重后果,大量重复或错误数据被保存到数据库。
举例如下,有个订单操作界面,用户有个查询按钮,用来查询订单的状态,如果是“失败”订单的话,会返还用户之前的“扣款”,并将订单更新为“已返还用户扣款”的状态。
程序片段如下:
if ("未返还用户扣款" && "失败订单") {
// 返还用户扣款,并更新数据库记录为“已返还用户扣款”
}
假设if内的逻辑是调用WebService操作的,并且很耗时,例如需要20秒。恰好,这个界面操作使用Ajax做的,并且没有加屏蔽层。这个用户的手还比较痒痒,不停地点击“查询”按钮来确定订单状态。
这下惨了,这个方法会被执行N次,并且会返还用户扣款N次。结果是用户赚大了,网站赔大了。
为什么会这样?因为if内的逻辑需要20秒才能执行完,在20秒之内,用户的点击都会响应,并正确进入if块(因为订单还没有被更新为“已返还用户扣款”的状态)。
在这类响应时间较长的方法,如果很重要,并且存在重复执行的可能。如果if块内的逻辑没有很好的控制办法的话。就必须加入时间控制,确保在20秒内,此方法不接收新的请求。
分享到:
相关推荐
防止用户误操作,重复提交
重复提交给网站服务端带来很大的压力,下面小编给大家分享一段代码关于jQuery如何防止Ajax重复提交,感兴趣的朋友一起看看吧
ajax判断商品是否重复
运用struts2解决表单的重复提交问题
下面给大家带来两种关于jquery 的ajax防止重复提交的解决方法,具体介绍如下所示: 1、第一种,对于onclick事件触发的的ajax 可以采用如下方法: 即在beforeSend中使点击按钮不可用,ajax结果返回后置为可用 $....
php+Ajax远程加载防止重复提交,登录表单loading效果,一个提高用户体验,二个防止避免重复提交表单,ajax判断加载是否完成。
主要介绍了JS Ajax请求如何防止重复提交的相关资料,通过覆盖掉$.ajax而达到防止重复提交的问题,实现代码简单,需要的朋友可以参考下
先说对话框(Dialog)里的表单提交 错误方案 说起错误方案,比如,点击提交按钮,本地验证,验证通过立即让按钮不可点,这些没问题,而我的错误点概括是:在某个最后执行的回调函数的最后一行,我做了2个操作:1,...
NULL 博文链接:https://qjoycn.iteye.com/blog/1513669
一,缩略图片点击放大有遮罩层,按原画尺寸放大,在次点击任意位置缩小的demo。 二,ajax 用于上传文件 或提交数据时防止重复加载的遮罩层js代码
1AJAX避免用户重复提交请求实现方案设计说明书[定义].pdf
在使用AJAX(jQuery)异步请求数据时,为了避免因某些原因用户同时多次点击按钮,提交重复的请求,我们需要禁用请求提交按钮。 重点:jQuery的 attr 和 removeAttr 两个函数,主要是元素button的disabled属性。 Demo:...
ajax分页查询完美示例.rar ajax分页查询完美示例.rar ajax分页查询完美示例.rar
主要介绍了vue 按钮多次点击重复提交数据的问题,本文通过实例结合的形式给大家介绍的非常详细,需要的朋友可以参考下
一个简单的ExtJs4.0搭建环境,利用Ext Ajax的方式提交表单,可使得显示层和控制层完全分开.
struts2防止表单重复提交--重定向
做项目时总会碰到ajax提交的功能,特别是在做后台提交时,一般都会用模型自动生成,这个功能的使用会比较频繁,其实只要了解了流程,操作还是挺简单的,使用起来也方便。 表单部分 <?php $form = ActiveForm::...
一款简单易用的jquery插件showLoading,可以有效防止页面重复提交问题,注意,使用的时候如果涉及到ajax,要将asyc设为true,否则不生效