首页 > 其他分享 >避免重复提交注解

避免重复提交注解

时间:2023-01-12 11:24:49浏览次数:29  
标签:提交 String point 重复 AvoidRepeatableCommit timeout 注解 method

避免重复提交注解

 

①注解

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface AvoidRepeatableCommit
{
    /**
     * 指定时间内不可重复提交,单位毫秒
     * @return
     */
    long timeout() default 100;

}

 

② 实现方法

@Aspect
@Component
@Slf4j
public class AvoidRepeatableCommitAspect
{
    @Resource
    private RedisService redisService;

    /**
     * @param point
     */
    @Around("@annotation(com.iktapp.skc.common.security.aspect.avoidrepeat.AvoidRepeatableCommit)")
    public Object around(ProceedingJoinPoint point) throws Throwable {

        HttpServletRequest request  = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest();
        String ip = IPUtil.getIPAddress(request);
        //获取注解
        MethodSignature signature = (MethodSignature) point.getSignature();
        Method method = signature.getMethod();
        //目标类、方法
        String className = method.getDeclaringClass().getName();
        String name = method.getName();
        String ipKey = String.format("%s#%s",className,name);
        int hashCode = Math.abs(ipKey.hashCode());
        String key = String.format("%s_%d",ip,hashCode);
        AvoidRepeatableCommit avoidRepeatableCommit =  method.getAnnotation(AvoidRepeatableCommit.class);
        long timeout = avoidRepeatableCommit.timeout();
        if (timeout < 0){
            //过期时间5秒
            timeout = 5*1000;
        }
        String value = (String) redisService.getCacheObject(key);
        if (StringUtils.isNotBlank(value)){
            return AjaxResult.error("请勿重复提交");
        }
        redisService.setCacheObject(key, UUID.randomUUID().toString(),timeout, TimeUnit.MILLISECONDS);
        //执行方法
        Object object = point.proceed();
        return object;
    }

}

  

 

标签:提交,String,point,重复,AvoidRepeatableCommit,timeout,注解,method
From: https://www.cnblogs.com/xingmeng63/p/17045913.html

相关文章

  • MQ——如何处理消费过程中的重复消费
     1、关于消息重复消息重复的情况必然存在在MQTT协议中,给出了三种传递消息时能够提供的服务质量标准,这三种服务质量从低到高依次是:Atmostonce:至多一次。消息在传......
  • 【Spring注解】1.@Configuration&@Bean
    @Configuration&@Bean微信公众号:​​程序yuan​​如果需要spring注解视频,请到公众号评论留言。源码,视频全部奉上!当前springboot真是老火了,所以非让自己学一把,但是学了前面......
  • 代码随想录day01|26.删除重复项;27.移除元素;704.二分;844.含退格字符串
    2627;704;844关键内容:数组;二分;快慢指针首先,在面对数组时,我们必须清楚,数组中的元素在内存中是连续分布的,单独删除一个元素是不可实现的,所以当出现类似删除原数组元素之......
  • 软件开发入门教程网之Git 查看提交历史
    Git查看提交历史Git提交历史一般常用两个命令:gitlog -查看历史提交记录。gitblame<file> -以列表形式查看指定文件的历史修改记录。​​gitlog{#git-log}​​在......
  • 避免 MySQL 插入重复数据的 4 种方式
    最常见的方式就是为字段设置主键或唯一索引,当插入重复数据时,抛出错误,程序终止,但这会给后续处理带来麻烦,因此需要对插入语句做特殊处理,尽量避开或忽略异常,下面我简单介绍一......
  • 注解与反射
    注解与反射1内置注解packagecom.feng.annotation;importjava.util.ArrayList;importjava.util.List;/***@Authorfengpeng*@Date2022/12/29*@Time2......
  • Oracle分页查询出现重复数据的解决方法
    在使用MybatisPlus分页功能时发现:前端查询第一页是没问题的,但是向后查询的时候数据始终是第一页的查询第一页的时候发现没有任何问题往后查询,比如查询第二页时数据......
  • 找出整型数组中重复次数最多元素集合中的最小值
    考虑用map去处理,然后筛选出map里值最大的元素集合,最后集合中键最小的那个元素  importjava.util.*;importjava.util.stream.Collectors;publicclassMain{......
  • Lombok中@Builder和@SuperBuilder注解的用法
    @Builder是lombok中的注解。可以使用builder()构造的Person.PersonBuilder对象进行链式调用,给所有属性依次赋值。Personperson1=Person.builder()......
  • app直播源码,java自定义注解
    app直播源码,java自定义注解word注解代码@Target({ElementType.METHOD,ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Inherited@Documentedpublic@interface......