我们在做web应用的时候通常会遇到前端提交按钮重复点击的场景,在某些新增操作上就需要做幂等性限制来保证数据的可靠性。下面来用java aop实现幂等性校验。

一:首先我们需要一个自定义注解

package com.yuku.yuku_erp.annotation;

import java.lang.annotation.*;

/**
* @author 名一
* @ClassName IdempotentAnnotation
* @description: 用来标记需要校验幂等性的接口
* @datetime 2024年 02月 03日 14:48
* @version: 1.0
*/
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface IdempotentAnnotation {
String idempotentType();
}

二:创建一个幂等校验的切面类

package com.yuku.yuku_erp.aop;

import com.yuku.yuku_erp.annotation.IdempotentAnnotation;
import com.yuku.yuku_erp.constant.RedisKeyConstant;
import com.yuku.yuku_erp.exception.MyException;
import com.yuku.yuku_erp.utils.RedisShardedPoolUtil;
import com.yuku.yuku_erp.utils.TokenUtil;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component; import java.lang.reflect.Method; /**
* @author 名一
* @ClassName CheckIdempotentAop
* @description: 幂等性校验
* @datetime 2024年 02月 03日 14:59
* @version: 1.0
*/
@Slf4j
@Aspect
@Component
public class CheckIdempotentAop { @Pointcut("execution(* com.yuku.yuku_erp.controller..*.*(..))")
public void checkCut(){
} @Before("checkCut()")
public void checkIdempotent(JoinPoint joinPoint){
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
Method method = signature.getMethod();
if (method.isAnnotationPresent(IdempotentAnnotation.class)){
IdempotentAnnotation annotation = method.getAnnotation(IdempotentAnnotation.class);
String idempotentType = annotation.idempotentType();
String idempotentToken = TokenUtil.getRequest().getHeader("idempotentToken");
String idemToken = idempotentType + idempotentToken;
log.info("checkIdempotent idempotentType:{}, idempotentToken:{}", idempotentType, idempotentToken); Boolean flag = RedisShardedPoolUtil.sismember(RedisKeyConstant.IDEMPOTENT_TOKEN_LIST, idemToken);
if (!flag){
log.error("checkIdempotent error idempotentType:{}, idempotentToken:{}, flag:{}", idempotentType, idempotentToken, flag);
throw new MyException("该接口已提交过,请不要重复提交");
}
RedisShardedPoolUtil.delSetByValue(RedisKeyConstant.IDEMPOTENT_TOKEN_LIST, idemToken);
log.info("checkIdempotent idempotentType:{}, idempotentToken:{}, flag:{}", idempotentType, idempotentToken, flag);
}
}
}

三:在需要切面的接口上使用幂等校验注解

@IdempotentAnnotation(idempotentType = "checkIdempotentToken")
@GetMapping("/checkIdempotentToken")
@ApiOperation(value = "校验幂等性示例")
public CommonResult<String> checkIdempotentToken(){
return CommonResult.success();
}

到此幂等校验就完成了

java实现幂等性校验的更多相关文章

  1. java接口幂等性校验

    关于接口幂等性的概念: 幂等性:同一接口调用多次(使用相同的参数),对系统的影响是相同的. 怎样才是对系统有影响? 有影响--->增删改操作,修改一个用户信息,删除用户与某人的关联关系,生成一个 ...

  2. springboot + redis + 注解 + 拦截器 实现接口幂等性校验

    一.概念 幂等性, 通俗的说就是一个接口, 多次发起同一个请求, 必须保证操作只能执行一次 比如: 订单接口, 不能多次创建订单 支付接口, 重复支付同一笔订单只能扣一次钱 支付宝回调接口, 可能会多 ...

  3. Springboot + redis + 注解 + 拦截器来实现接口幂等性校验

    Springboot + redis + 注解 + 拦截器来实现接口幂等性校验   1. SpringBoot 整合篇 2. 手写一套迷你版HTTP服务器 3. 记住:永远不要在MySQL中使用UTF ...

  4. Java自定义注解源码+原理解释(使用Java自定义注解校验bean传入参数合法性)

    Java自定义注解源码+原理解释(使用Java自定义注解校验bean传入参数合法性) 前言:由于前段时间忙于写接口,在接口中需要做很多的参数校验,本着简洁.高效的原则,便写了这个小工具供自己使用(内容 ...

  5. java使用xsd校验xml样例

    知识点:XSD文件是指XML结构定义 ( XML Schemas Definition )文件,是DTD的替代品.可以用一个指定的XML Schema来验证某个XML文档,以检查该XML文档是否符合其 ...

  6. java实现身份证校验

    原文来自:java教程网 题目:身份证校验   身份证校验   如果让你设计个程序,用什么变量保存身份证号码呢?长整数可以吗?不可以!   因为有人的身份证最后一位是"X"   实 ...

  7. java 生成随机校验码

    1 import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.image.Buffe ...

  8. java 使用注释校验数据有效性

    验证注解 验证的数据类型 说明 空检查 @Null 任意类型 验证注解的元素值是null @NotNull 任意类型 验证注解的元素不是null @NotBlank CharSequence子类型(C ...

  9. java常用正则校验工具类

    正则常用校验工具类 import java.util.regex.Pattern; /** * @program: * @description: 校验工具类 * @author: xujingyan ...

  10. java生成MD5校验码

    在Java中,java.security.MessageDigest (rt.jar中)已经定义了 MD5 的计算,所以我们只需要简单地调用即可得到 MD5 的128 位整数.然后将此 128 位计 ...

随机推荐

  1. java项目实践-tomcat实现用户登录-day17

    目录 1. 安装 2. 初识tomcat 2. 创建tomcat项目 3. 启动之前 3. java jsp 4. Request Response对象的其他属性 5. 用户登录小功能 1. 安装 t ...

  2. Linux进阶命令-grep

    Linux进阶命令----grep 目录 Linux进阶命令----grep grep 命令介绍 grep命令格式 常用选项 模式部分 匹配字符: 匹配次数: 位置锚定: grep 命令介绍 Linu ...

  3. 问题--C++单例模式中唯一对象初始化时关于在类外调用私有的无参构造问题

    1.问题 在单例模式中初始化单例对象Person* Person::signal= new Person; 这一步在类外,而new Person需要调用私有的无参构造,但是只有在类内部才能调用私有函数 ...

  4. 【MACRO】嵌入式实用的宏技巧 DEBUG-printf 、 #/##

    from: C语言.嵌入式中几个非常实用的宏技巧 (qq.com) 宏打印函数 在我们的嵌入式开发中,使用printf打印一些信息是一种常用的调试手段.但是,在打印的信息量比较多的时候,就比较难知道哪 ...

  5. Mybatis @Insert插入数据返回自增的主键id

    mapper层 @Insert("insert into t_user (username,password,valid,create_time) values (#{username},# ...

  6. IDE-常用插件

    2021-8-25_IDE-常用插件 1. 背景 提升编写代码的舒适度,提升开发效率 2. 常用插件列表 IDE EVal Reset 白嫖付费的golang编辑器,reset插件可以重置golang ...

  7. redis-持久化-RDB-AOF.png

  8. 百度网盘(百度云)SVIP超级会员共享账号每日更新(2023.12.10)

    一.百度网盘SVIP超级会员共享账号 可能很多人不懂这个共享账号是什么意思,小编在这里给大家做一下解答. 我们多知道百度网盘很大的用处就是类似U盘,不同的人把文件上传到百度网盘,别人可以直接下载,避免 ...

  9. 是否开启raid卡缓存的影响

    开启raid卡缓存 Write back 对IO性能的影响 背景 公司买了一台服务器. 想进行一下升级 但是因为管理员担心数据丢失, 使用了write through + (raid6 + hotsp ...

  10. ESXi查看底层存储磁盘厂商型号的方式与方法

    ESXi查看底层存储磁盘厂商型号的方式与方法 背景 公司一台过保的服务器出现了磁盘告警 Vendor不太靠谱. 过保的机器就不管了 不买他们的服务器也不说一下是啥硬盘. 想自己替换,需要先获取磁盘的型 ...