重复提交控制

来源:互联网 发布:风云纯网络防火墙 编辑:程序博客网 时间:2024/05/19 14:50

在项目的开发过程中,经常会遇到重复提交的问题,特别是网速不好的时候,用户经常会认为没有点击到,然后重复点击,这样很容易造成保存数据重复等,严重的时候,比如支付则可能造成重复支付,严重影响用户体验,如何解决这类问题呢?

要解决这个问题,根据web的原理,可以分为从客户段控制,服务器端控制,客户端服务器端联合控制三种情况。

客户端控制,最简单的实现就是点击按钮后,将按钮变灰,这时按钮已经不可以再次点击,只有当请求处理完成后,才可以根据返回结果情况继续进行操作,这样即能保证用户不会由于误操作造成重复提交,缺点是每次点击按钮后,都要手动更改按钮状态,程序实现起来比较麻烦。

在客户端控制中,也可以通过客户端请求框架来实行统一控制,即当用户点击时,程序判断出是由哪个按钮进行操作导致的请求,知道操作按钮后,将该按钮变灰,请求返回以后,再将按钮变为可用状态,这样则直接将问题变成了如何判断出是否由某个按钮触发,很不幸由于js在各个浏览器中不能通用,有些浏览器没法直接获取事件来源对象,这样则只有通过对按钮增加一个绑定事件,标识出来源按钮来识别。通过这种方式,则不需要程序去特别处理这类问题,只要框架实现就行了,当然问题就是如果程序去掉了所有按钮事件,那就无能为力了。

另外,客户端控制也有一定的问题,假如请求返回回来后,程序已经将按钮重新变为可用,但是这时程序出错,导致页面没有关闭,则这个时候客户又可以点击了,当然这种情况只会再极特许的情况下出现(一般程序上线前,都会有严格的测试,而且数据返回后也会通过一定的形式通知用户),但在要求严格控制的系统中,这种情况也应该避免。

服务器端控制,在数据保存的时候,通过预先查询的形式,如果数据库中已经有相同的数据,则提示数据已存在,然后在前台提示用户数据已存在,这种方式用户体验不是太好,一般很少采用

客户端服务器端联合控制,在要求严格的控制中,像支付页面,要求打开一个页面一定只能进行一次支付,单纯的采用客户端控制还是有一定的风险,如是有了这样的控制方法。在页面打开时,服务器会生成一个唯一ID,保存到用户的session中,同时这个ID也会页面中存在,当用户提交,后台进行处理时,会先判断提交的ID与用户session中的ID是否一致,如果一致,则将sessionID清除(防止下一次重复处理),然后进行数据处理操作,当出现重复点击时,由于该ID已经处理掉,则后台服务器能清楚的知道这个请求是重复的,这种实现程序实现起来比较麻烦,除了在极其要求严格的系统功能中,不然一般不用。
原创粉丝点击