Restful api 防止重复提交

当前不少网站是先后分离的,前端(android,iso,h5)经过restful API 调用 后端服务器,这就存在一个问题,对于建立操做,好比购买某个商品,若是因为某种缘由,手抖,控件bug,网络错误,可能致使一次操做实际上购买了屡次同一个产品。因此,咱们要考虑防止重复提交。这个重复提交咱们只限定于建立操做,对于修改和删除操做,原则上是幂等的,不用担忧,查询操做更不用担忧重复操做。前端

方案一,前端在提交时候生成一个基于时间的sequence,将这个参数传到后端,后端根据uriPath+userId+sequence做为key,采用redis分布式锁,setNX,防止重复提交android

方案二,前端不用传递sequence,后端根据请求的payload和其余参数来肯定惟一,uriPath+userId+MD5(JsonString(全部参数))做为key,用redis分布式锁redis

具体实现:spring

对于方案一,防止重复提交交给了前端控制,sequence的生成能够是时间戳。后端能够作在servlet filter 中或者在restful 框架的filter中好比resteasy 的ContainerRequestFilter中后端

对于第二种方案,防止重复提交彻底由后端控制,前端无感,不能作在filter中,由于request payload只能被消费一次。能够用spring aop来实现,对resource method 作aop拦截。服务器

优劣:基于咱们的目的,是为了防止重复提交,第二种方案可以更完全的防止重复提交,而且易于控制。restful

相关文章
相关标签/搜索