基于AOP实现接口防重复设计
1. 使用背景
由于客户端抖动、快速操作、网络通信或者服务器响应慢,造成服务器重复处理。防止重复提交,除了从前端控制,后台也需要控制。因为前端的限制不能解决彻底。接口实现,通常要求幂等性,保证多次重复提交只有一次有效。而对于更新操作,达到幂等性很难。
幂等性:
幂等性原本是数学上的概念,用在接口上就可以理解为:同一个接口,多次发出同一个请求,必须保证操作只执行一次。 调用接口发生异常并且重复尝试时,总是会造成系统所无法承受的损失,所以必须阻止这种现象的发生。
比如下面这些情况,如果没有实现接口幂等性会有很严重的后果: 支付接口,重复支付会导致多次扣钱 ;订单接口,同一个订单可能会多次创建。
2. 如何保证接口幂等性
解决方法有两类:
- 由客户端对接口调用频率进行控制。例如前端可以在提交按钮上绑定操作,在提交后的一段时间内不再允许点击。
- 由服务端对接口请求进行校验。可以是对接口的token校验,或者通过数据库的主键唯一性实现
在实际应用中都是二者结合起来,前后端共同实现防重复提交。
3. 实现思路
防重复是很多接口都需要用到的,如果在每个接口上都直接插入一段防重复验证代码势必增加代码的耦合性,因此考虑用自定义注解+AOP来实现无侵入式的功能增强。