首页 > 数据库 >java 使用注解+Aop+redis实现防止重复提交

java 使用注解+Aop+redis实现防止重复提交

时间:2022-11-15 14:36:06浏览次数:43  
标签:java String request redis resubmit Aop 注解 public

防止重复提交的方式有很多

  可以用数据库的唯一索引,保证数据完整性

  在业务层用select....for update,依然是使用数据库的事务来做的

  使用注解+拦截器 HandlerIntercetper+redis

  我这里使用注解+aop+redis。

1、注解

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Resubmit {
    int interval() default 5; // s 单位为秒,x秒内防止重复提交
}

 

2、切面实现,

@Aspect
@Component
public class ResubmitAspect {
    private final static String CACHE_KEY = "resubmit:";

    @Resource
    private CacheComponent cacheComponent;

    @Around(value = "@annotation(resubmit)")
    public Object around(ProceedingJoinPoint point, Resubmit resubmit) throws Throwable {
        ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = requestAttributes.getRequest();
        Object loginUser = ThreadLocalConst.getLoginUser();
        String username = null;
        if(Objects.nonNull(loginUser)){
            username = ThreadLocalConst.getUserId().toString();
        }else {
            username = ThreadLocalConst.getRequestIp();
        }
    // 这里用于redis缓存的key用的是,已经登录的userId + 请求方法 + 请求路径。没登录就用ip地址。
    // 可以用getSignature() 是方法的全限定名称 String cacheKey = CACHE_KEY + username + request.getMethod() + request.getRequestURI(); String shortString = point.getSignature().toShortString(); Boolean success = cacheComponent.setNx(cacheKey, shortString, resubmit.interval(), TimeUnit.SECONDS); // redis的setNx 命令,保证原子性 if(success){ Object result = point.proceed(); return result; }else { throw new BizException("请勿重复提交"); } } }

 

3、使用

    @PutMapping
    @Resubmit
    public JsonResult<Boolean> save(@Validated @RequestBody EnterpriseRecheckEditRequest request){
        return JsonResult.success(enterpriseRecheckService.add(request));
    }

 

对比是否是同一数据重复提交,判断方式还可以加入请求参数

标签:java,String,request,redis,resubmit,Aop,注解,public
From: https://www.cnblogs.com/junnnnnnnn/p/16892297.html

相关文章

  • java.sql.SQLException: Access denied for user 'root'@'localhost' (using password
    java.sql.SQLException:Accessdeniedforuser'root'@'localhost'(usingpassword:YES)解决办法原因:在运行sql语句报错后自己失去了登录权限解决办法:找到安装mys......
  • java poi导出excel单元格设置自定义背景颜色(任意颜色)
    转自:http://t.csdn.cn/QHfUU//创建一个workbook对象Workbookworkbook=newXSSFWorkbook();//创建一个sheet对象Sheetsheet=workbook.createSheet();//创......
  • Java 内存分区之什么是 CCS区 Compressed Class Space 类压缩空间
    https://blog.csdn.net/qq_27093465/article/details/106760961 Java内存分区之什么是CCS区CompressedClassSpace类压缩空间  了解到什么是ccs区,一般都是实际......
  • Java String类的isEmpty(),null的区别
    JavaString类的isEmpty(),null的区别一、理解isEmpty()完全等同于string.length()==0若String对象本身是NULL,即字符串对象的引用是空指针,那在使用String.isEmpty()方法......
  • AOP记录日志操作
    AOP的定义AOP通过预编译方式和运行期动态代理实现,在不修改源代码的情况下,给程序动态统一添加功能的一种技术,简称AOP,一句话总结:在不改变原有代码的条件下,对功能进行......
  • 【Javaweb】六-servlet层
    AdminServlet.jap@WebServlet("/AdminServlet")publicclassAdminServletextendsHttpServlet{@Overrideprotectedvoidservice(HttpServletRequestrequ......
  • Javascript中字符串的instanceof String的结果
    如果是单纯的字符串赋给变量,虽然类型为string,但是instanceofString是false,并不是String对象,因为没有创建实例. 而这种new一个String实例则instanceof是属于String......
  • JAVA中的字符串加空格的实现方式
    一、问题描述我们现在输入了一个字符串,然后可能在一些情况下,我们需要将字符串中的每一个字符拿空格隔开,那么这种样式应该如何实现呢?二、实现思路我们直接将字符串变成数......
  • linux部署java环境
    一、进入到下载目录cd/usr/local/src二、下载Java下载地址JavaDownloads|Oracle下载完后执行下面这个命令然后选择到下载的文件后通过xshell上传上去或者通过......
  • UML中依赖泛化关联实现聚合组合的Java实现
     UML中依赖泛化关联实现聚合组合的Java实现在类图中,类与类之间的关系主要有一下几种: 泛化关系:publicclass Employee {}public class SaleEmployee extends Employee......