场景
在常规的web系统中,涉及到写操作的接口请求调用时,前端往往有做防止重复提交的验证,但是从系统的完整性上说,仅仅只在前端做校验实际上是有缺陷的,恶意调用接口者仍可通过其他工具重复调用接口,如果只是涉及读数据的接口可能还没什么问题,一旦重复调用涉及写的接口,则可能会造成无法预估的数据问题。
解决方案
如果只是单机服务,可以直接使用单机线程锁,在接口调用完成之前锁住接口,获取锁失败则快速返回,防止用户重复提交。考虑到系统的扩展性,使用基于redis的分布式锁,使用的spring的切面做前置增强获取锁,后置增强释放锁。
流程图
参考代码
1 | package com.smart.security.aop; |
总结
使用基于redis的分布式锁,可以解决后端接口重复调用导致的数据问题,锁的过期时间可以自由配置,同时能在集群的条件下使用,是一个在中等并发下比较完善的方案。