在一些特殊场景下,可能会导致表单重复提交,如:
- 网络延时,用户多次点击提交
- 刷新页面导致重复提交表单
- 后退之后再次提交表单
- …
有些幂等操作允许重复提交表单,但大多数操作都是非幂等的,重复提交将会导致系统异常甚至系统崩溃。 所以,我们需要尽量避免表单重复提交。
这里有两种思路:
- 前端拦截,这可以拦截绝大部分用户误操作
- 后端处理
前端处理
表单中添加隐藏参数noncestr
(是一个随机字符串,用来标识表单),提交表单时,noncestr
一起提交,
然后锁定表单,将表单状态设置为不可提交(或一段时间内不可提交),
如果对表单再次编辑,修改noncestr
值,解除表单锁定状态。
后端处理
- 先从cache中查询
noncestr
对应操作, - 如果查询到了对应的操作,判断操作的处理状态
- 已经完成,直接将操作对应的结果返回
- 未完成,返回202响应,告知客户端已接受该请求,并正在处理中
- 如果未查询到对应的操作
- 查询数据库,看是否有对应操作的记录
- 如果有对应的操作记录,将操作结果存放到缓存中,然后返回处理结果
- 如果没有,进行正常的业务处理,将操作结果存放到缓存中,然后返回处理结果
Python代码如下:
1 | cache = get_cache() # 缓存 |