`
清晨阳光
  • 浏览: 39025 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

关于Ajax的重复提交

阅读更多

在页面的POST提交请求时,如果不做特殊处理,用户刷新一次页面,就会导致重复提交一次。

 

在Ajax里面,这个问题也是尤为严重的,用户只要重复点击那个按钮一次,就会重复提交一次。很多人会说,加屏蔽层或者将按钮灰掉。好,这个对付普通用户是可以的,如果是恶意用户呢,自己构造请求,用程序来反复提交,会搞死人的。

 

通常,方法执行需要时间,一般比较短,但是某些和WebService打交道以及和读写文件打交道的方法,都是需要很长时间的。恰好,在这个方法里,有重要的逻辑。结果会很惨,用户不停地通过Ajax来调用这个方法,结果造成严重后果,大量重复或错误数据被保存到数据库。

 

举例如下,有个订单操作界面,用户有个查询按钮,用来查询订单的状态,如果是“失败”订单的话,会返还用户之前的“扣款”,并将订单更新为“已返还用户扣款”的状态。

 

程序片段如下:

if ("未返还用户扣款" && "失败订单") {

    // 返还用户扣款,并更新数据库记录为“已返还用户扣款”

}

假设if内的逻辑是调用WebService操作的,并且很耗时,例如需要20秒。恰好,这个界面操作使用Ajax做的,并且没有加屏蔽层。这个用户的手还比较痒痒,不停地点击“查询”按钮来确定订单状态。

 

这下惨了,这个方法会被执行N次,并且会返还用户扣款N次。结果是用户赚大了,网站赔大了。

为什么会这样?因为if内的逻辑需要20秒才能执行完,在20秒之内,用户的点击都会响应,并正确进入if块(因为订单还没有被更新为“已返还用户扣款”的状态)。

 

在这类响应时间较长的方法,如果很重要,并且存在重复执行的可能。如果if块内的逻辑没有很好的控制办法的话。就必须加入时间控制,确保在20秒内,此方法不接收新的请求。

分享到:
评论
2 楼 newzhq 2011-11-18  
放大法放大放大
1 楼 newzhq 2011-11-18  
发放大发达

相关推荐

Global site tag (gtag.js) - Google Analytics