首页 > 编程语言 >java实现幂等性校验

java实现幂等性校验

时间:2024-02-18 10:35:56浏览次数:39  
标签:yuku java idempotentType 实现 校验 idempotentToken import com

我们在做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();
    }

到此幂等校验就完成了

 

标签:yuku,java,idempotentType,实现,校验,idempotentToken,import,com
From: https://www.cnblogs.com/mingyi-wang/p/18018873

相关文章

  • 深度学习框架theano下的batch_norm实现代码——强化学习框架rllab
    深度学习框架theano下的batch_norm实现代码——强化学习框架rllab#encoding:utf-8importlasagne.layersasLimportlasagneimporttheanoimporttheano.tensorasTTclassParamLayer(L.Layer):def__init__(self,incoming,num_units,param=lasagne.init.......
  • 教你用Rust实现Smpp协议
    本文分享自华为云社区《华为云短信服务教你用Rust实现Smpp协议》,作者:张俭。协议概述SMPP(ShortMessagePeer-to-Peer)协议起源于90年代,最初由Aldiscon公司开发,后来由SMPP开发者论坛维护和推广。SMPP常用于在SMSC(ShortMessageServiceCenter,短信中心)和短信应用之间传输短消息......
  • 物理隔离环境下 如何实现数据安全导入导出?
    数据安全导入导出是指在确保数据安全的前提下,将文件从一个系统或网络环境传输到另一个系统或网络环境的过程。一般情况下,都是物理隔离的环境,而且是单向的数据导入导出。我们以数据导出为例,要实现这种物理隔离环境下的数据安全导出,比较传统的方式就是用户将文件上传到指定服务器,......
  • linux 中awk命令实现根据一列数值的大小筛选指定列多个类别的最大或者最小项
     001、(base)[b20223040323@admin1test2]$cat003.txt##测试数据如下,第一列有多个项,且部分项有重复,实现根据第三列筛选出最大的项ID=gene-TRNAC-GCArna-TRNAC-GCA72ID=gene-ATP5Orna-XM_005674665.3793ID=gene-ITSN1rna-XR_001917533.14......
  • Java集合篇之深入解析LinkedList
    写在开头作为ArrayList的同门师兄弟,LinkedList的师门地位逊色不少,除了在做算法题的时候我们会用到它之外,在实际的开发工作中我们极少使用它,就连它的创造者都说:“Iwroteit,andIneveruseit”,想想颇有点好笑,但这并不影响我们去学习它,个人认为它底层的链表逻辑对于我们代码思想......
  • Java是值传递
    一、定义值传递:当⼀个参数按照值的⽅式在两个⽅法之间传递时,调⽤者和被调⽤者其实是⽤的两个不同的变量——被调⽤者中的变量(原始值)是调⽤者中变量的⼀份拷⻉,对它们当中的任何⼀个变量修改都不会影响到另外⼀个变量。引用传递:当⼀个参数按照引⽤传递的⽅式在两个⽅法之间传递时,......
  • 在k8S中,如何使用EFK实现日志的统 一管理?
    在Kubernetes(k8S)中使用ElasticSearch、Fluentd和Kibana(EFK)实现日志的统一管理,通常涉及以下几个步骤:安装Elasticsearch:Elasticsearch是一个分布式搜索和分析引擎,用于存储、检索和分析日志数据。你需要在集群中部署至少一个Elasticsearch节点,并可能需要配置副本集以保证......
  • 10 个图像悬停效果 CSS & JavaScript 代码片段
    悬停效果一直是向网站添加交互元素的最简单方法之一,我们看到它们经常用于突出显示文本链接或按钮。悬停效果尤其强大的一个领域是当它们应用于图像时,无论是作为小型卡片布局的一部分还是大型相册的一部分,都可以产生很棒的效果。今天,我们将向您展示设计师将悬停效果集成到图像中的......
  • JavaSE第五步 —— 运算符
    一、运算符运算符的分类不尽相同,以下都是参考的相关书籍名称符号算数运算符一元运算符++、--算术运算符二元运算符+、-、*、/、%赋值运算符=扩展运算符+=、-=、*=、/=关系运算符>、<、=、>=、<=、==、!=、instanceof逻辑运算符&&、位......
  • Spring Boot + MyBatis-Plus 实现 MySQL 主从复制动态数据源切换
    MySQL主从复制是一种常见的数据库架构,它可以提高数据库的性能和可用性。动态数据源切换则可以根据业务需求,在不同场景下使用不同的数据源,比如在读多写少的场景下,可以通过切换到从库来分担主库的压力。在本文中,我们将介绍如何在SpringBoot中实现MySQL动态数据源切换,使用My......