当前很多网站是前后分离的,前端(android,iso,h5)通过restful API 调用 后端服务器,这就存在一个问题,对于创建操作,比如购买某个商品,如果由于某种原因,手抖,控件bug,网络错误,可能导致一次操作实际上购买了多次同一个产品。所以,我们要考虑防止重复提交。这个重复提交我们只限定于创建操作,对于修改和删除操作,原则上是幂等的,不用担心,查询操作更不用担心重复操作。

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

方案二,前端不用传递sequence,后端根据请求的payload和其他参数来确定唯一,uriPath+userId+MD5(JsonString(所有参数))作为key,用redis分布式锁

具体实现:

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

对于第二种方案,防止重复提交完全由后端控制,前端无感,不能做在filter中,因为request payload只能被消费一次。可以用spring aop来实现,对resource method 做aop拦截。

优劣:基于我们的目的,是为了防止重复提交,第二种方案能够更彻底的防止重复提交,并且易于控制。

原文:https://blog.csdn.net/joshua1830/article/details/78931420

最新文章

  1. C#获得MAC地址(网卡序列号)代码
  2. linux常用工具集合
  3. 通过struts.xml搭建、为属性注入值_2015.01.04
  4. ibatis 的 "This SQL map does not contain a MappedStatement"的错误
  5. Sublime Text 2 快捷键大全
  6. Unity3D 相关项目代码
  7. 转载:PCB名詞解釋:通孔、盲孔、埋孔
  8. java ee eclipse 配置 ssh框架
  9. 使用JSP实现商场购物车模块
  10. 我的MYSQL学习心得(十二)
  11. WEB服务器如何选择 Apache or Nginx?
  12. STL语法——映射:map 反片语(Ananagrams,UVa 156)
  13. Python——安居客租房信息爬取(以南昌为例)
  14. Idea + Git + GitLab 使用
  15. python第二十三天-----作业中
  16. unittest多线程生成报告-----BeautifulReport
  17. avalon2学习教程02之vm
  18. App优化 StrictMode 严格模式
  19. 【51nod】1238 最小公倍数之和 V3 杜教筛
  20. 关于进度管理工具Gantt图

热门文章

  1. JVM内存管理及GC机制
  2. HDU1599(Floyd最小环)
  3. Android 关于Activity的四种启动模式的简单介绍
  4. Jmeter—实现识别验证码登录
  5. 避免代码merge后无法构建发布(GItlabCI + Jenkins)
  6. 1.2《想成为黑客,不知道这些命令行可不行》(Learn Enough Command Line to Be Dangerous)——开始第一条命令
  7. iOS Swift WisdomScanKit二维码扫码SDK,自定义全屏拍照SDK,系统相册图片浏览,编辑SDK
  8. Microsoft Tech Summit 2017
  9. 定义C#鼠标指针的形状 Cursor
  10. CS190.1x Scalable Machine Learning