1. 如何防止表单重复提交
背景介绍:
平时开发的项目中可能会出现下面这些情况:
- 由于用户误操作,多次点击表单提交按钮。
- 由于网速等原因造成页面卡顿,用户重复刷新提交页面。
- 黑客或恶意用户使用postman等工具重复恶意提交表单(攻击网站)。
这些情况都会导致表单重复提交,造成数据重复,增加服务器负载,严重甚至会造成服务器宕机。因此有效防止表单重复提交有一定的必要性。
(接口)幂等性:
确保数据的唯一性
解决方案:
- 客户端解决问题:通过JavaScript屏蔽提交按钮(把按钮置灰)(不推荐)
通过js代码,用户点击提交按钮后,屏蔽提交按钮,使得用户无法点击提交按钮或点击无效。
代码实现:方法一:设置一个提交状态,默认为false,提交表单后改为true。
方法二:维护一个提交按钮队列,用jquery监听submit按钮的提交,如果在提交队列中,那么不再提交。
缺点:容易被绕过。比如用户刷新或通过postman工具绕过前端页面,仍能重复提交。
给数据库增加唯一键约束(简单粗暴)
后端解决问题:利用token(随机数即可)防止表单重复提交(推荐)
流程:
数据提交前要向服务器申请 token,服务器把token 放到 redis 或 jvm 内存,token 有效时间
每次提交,服务器拦截器Interceptor拦截请求,后台校验token(表单请求头中是否有token,且是否和redis中的一致)
校验通过,执行业务逻辑,删除服务器存在redis的token——确保接口幂等性问题(只访问一次)
若重复提交,由于服务器这一端的token已被删除,所以无法匹配请求中携带的token,直接返回
其中,利用AOP技术对需要进行重复提交或网络延迟的方法(Controller里的mapper方法)进行切面封装处理,拦截请求