我們在做短影片整套原始碼的時候通常會遇到前端提交按鈕重複點選的場景,在某些新增操作上就需要做冪等性限制來保證資料的可靠性。下面來用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(); }
到此冪等校驗就完成了,以上就是短影片整套原始碼,如何實現冪等性校驗?, 更多內容歡迎關注之後的文章