在Web / App项目中,有一些请求或操作会对数据产生影响(比如新增、删除、修改),针对这类请求一般都需要做一些保护,以防止用户有意或无意的重复发起这样的请求导致的数据错乱。
常见的处理方案分为如下两类:
- 客户端处理
- 服务端处理
这节介绍一下服务端处理重复提交的思路。
木谷博客系统中针对那些非幂等的接口做了防重复提交,思路如下:
- 根据请求的**ip+hash(类名+方法名)**作为key
- 将这个key存入redis中,且设置过期时间,在过期之前保持互斥
当然一定要在接口执行之前拦截,可以使用拦截器或者AOP的方式。木谷博客中使用了AOP+注解的方式进行拦截。
定义注解
定义一个注解,标注在方法上,如下:
/**
* 自定义注解,避免重复提交
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy