在Web项目中,有一些请求或操做会对数据产生影响(好比新增、删除、更新),针对这类请求通常都须要作一些保护,以防止用户有意或无心的重复发起这样的请求致使的数据错乱。前端
本文总结了一些防止客户端重复发送请求的方法。ajax
在经典场景下,浏览器经过Form发送请求。所以只须要在Form onsubmit时将Submit按钮disable,就可以防止用户双击致使的重复请求(这种问题通常发生在年纪大的用户身上,他们分不清单击和双击)。数据库
可是随着前端的发展,Form之外的请求方式也愈来愈多,好比利用各类前端框架(Vue、AngularJs、Backbone等)写的App,他们更多的采用的是ajax的方式和后端交互。那么前端开发人员必须在开发时针对每一个表明发起请求的UI元素作处理,像Form同样,在发起请求的时候把相关UI元素禁用掉。json
而有些交互方式则可能连表明发起请求的UI元素都没有,好比Segmentfault的markdown编辑器就是在一边输入的时候一边保存的。那么这时就须要前端代码采用其余手段来控制重复请求的发生。后端
优势:浏览器
缺点:前端框架
服务端采用重定向的方式,防止用户刷新浏览器发出重复请求。这是比较经典的后端控制重复请求的方式,由于一旦重定向成功后,用户刷新浏览器所刷新的是那个重定向地址,而不是数据操做地址。服务器
优势:markdown
缺点:cookie
结合方法一和方法二的话却是能够解决大部分问题,可是解决不了如下问题:
token的流程是这样的:
关键点在于:
那么token是以怎样的形式传输的呢?我认为有如下两种方式:
Cookie:
推荐使用这种方式,由于浏览器每次都会将cookie携带在请求里一并发出,因此前端发送请求的代码都不须要修改,只要在发送请求前问服务器拿token就好了。
好比在进入Form页面时,服务器将token以cookie的形式一并携带在响应中,那么前端Form提交时,就会将cookie一并携带在请求中,前端的代码一点都不须要修改。
json:
前端发起ajax请求像后端拿token,后端以json的形式返回token,前端发送请求时将token携带在请求中,后端检验。
这种方式比Cookie稍微麻烦的地方是,前端必须写一些代码来保存这个token,而后在发送请求的地方要写一些代码把token携带在请求里。
优势:
缺点:
若是请求会insert数据,而这个数据正好存在业务主键,那么能够利用数据库的惟一约束来作进一步的防护。
有些业务情形下,请求是幂等的,这就意味着能够不用为重复发生请求而烦恼了——至少在业务逻辑层面不用烦恼了。