幂等性(防重复提交)

文章目录

  • [1. 实现原理](#1. 实现原理)
  • 2.使用示例
  • [3. @Idempotent注解](#3. @Idempotent注解)
  • [4. debug过程](#4. debug过程)

主要用途:防止用户快速双击某个按钮,而前端没有禁用,导致发送两次重复请求。

1. 实现原理

幂等性要求参数相同的方法在一定时间内,只能执行一次。本质上是基于redis的分布式锁。大体有以下步骤:

  • 方法执行前,利用MD5算法(不仅限于此),将方法名 + 方法参数计算获得一个key
  • 查询redis的key是否存在
    • 存在,则不执行方法
    • 不存在,将key存到redis,并设置过期时间,接着执行方法
  • 需要注意方法执行的时间不能超过过期时间

2.使用示例

在Controller添加@Idempotent注解即可。

3. @Idempotent注解

  1. DefaultIdempotentKeyResolver默认的key解析器
java 复制代码
public class DefaultIdempotentKeyResolver implements IdempotentKeyResolver {

    @Override
    public String resolver(JoinPoint joinPoint, Idempotent idempotent) {
    // 获得方法名
        String methodName = joinPoint.getSignature().toString();
        // 将参数拼接成字符串
        String argsStr = StrUtil.join(",", joinPoint.getArgs());
        // md5计算一个key
        return SecureUtil.md5(methodName + argsStr);
    }

}
  1. 对应AOP切面类IdempotentAspect
    核心代码如下:
  2. 生成的key加了前缀"idempotent",参看IdempotentRedisDAO。

4. debug过程

进入resolver方法里面

相关推荐
初听于你2 小时前
缓存技术揭秘
java·运维·服务器·开发语言·spring·缓存
小蒜学长3 小时前
springboot多功能智能手机阅读APP设计与实现(代码+数据库+LW)
java·spring boot·后端·智能手机
zizisuo5 小时前
解决在使用Lombok时maven install 找不到符号的问题
java·数据库·maven
笨蛋少年派6 小时前
JAVA基础语法
java·开发语言
Haooog6 小时前
654.最大二叉树(二叉树算法)
java·数据结构·算法·leetcode·二叉树
我真的是大笨蛋6 小时前
依赖倒置原则(DIP)
java·设计模式·性能优化·依赖倒置原则·设计规范
东方芷兰7 小时前
JavaWeb 课堂笔记 —— 20 SpringBootWeb案例 配置文件
java·开发语言·笔记·算法·log4j·intellij-idea·lua
Roye_ack7 小时前
【项目实战 Day9】springboot + vue 苍穹外卖系统(用户端订单模块 + 商家端订单管理模块 完结)
java·vue.js·spring boot·后端·mybatis
人间有清欢7 小时前
java数据权限过滤
java·mybatis·权限控制·数据过滤
A阳俊yi7 小时前
Spring——声明式事务
java·数据库·spring