关于java:SpringBootAopredisJedis防止重复提交

增加依赖

<!--   增加redis依赖     -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
<!--   增加aop依赖     -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>
<!--   增加jedis依赖     -->
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>2.8.2</version>
        </dependency>

配置redis(application-redis.properties)

spring.redis.host=localhost
spring.redis.port=6379

redis.host=localhost
redis.port=6379

配置redis(RedisConfig)

@Configuration
@PropertySource("classpath:/application-redis.properties")
public class RedisConfig {

    @Value("${redis.host}")
    private String host;
    @Value("${redis.port}")
    private Integer port;

    @Bean
    public Jedis jedis(){
        return new Jedis(host,port);
    }


}

自定义注解(NoRepeatSubmit)

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface NoRepeatSubmit {
    /**
     * 指定工夫内不可反复提交,单位毫秒秒
     * @return
     */
    int timeOut() default 3000;
}

AOP(RepeatSubmit)

@Aspect
@Component
public class RepeatSubmit {

    @Around("@annotation(noRepeatSubmit)")
    public Object around(ProceedingJoinPoint joinPoint, NoRepeatSubmit noRepeatSubmit){

//        获取注解
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
        Method method = signature.getMethod();

//        获取类,办法
        String className = method.getDeclaringClass().getName();
        String methodName = method.getName();

//        组装key用户惟一标识+操作和办法
        String key = "tokenKey" + className + methodName;

//        获取超时工夫
        int timeOut = noRepeatSubmit.timeOut();

//        创建对象 判断key值是否存在 无则抛出  有则增加redis缓存中 设置工夫生效
        Jedis jedis = new Jedis();
        if (jedis.exists(key)){
            System.out.println("请勿反复申请拦挡");
            throw new RuntimeException("请勿反复申请拦挡");
        }else{
            jedis.set(key,"申请胜利");
            System.out.println("申请胜利");
            jedis.pexpire(key,timeOut);
        }

        Object proceed = null;

        try {
            proceed = joinPoint.proceed();
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }
        return proceed;

    }

}

controller应用

@RestController
public class MessageController {

    @CrossOrigin
    @DeleteMapping("deleteMessage")
    @NoRepeatSubmit(timeOut = 3000)
    public String deleteMessage(@RequestBody Message message){
        int i = messageService.deleteMusic(message.getId());
        if (i>=1){
            return "数据删除胜利";
        }else {
            return "数据删除失败,请重试!";
        }
    }

    @CrossOrigin
    @PostMapping("updateMessage")
    @NoRepeatSubmit(timeOut = 3000)
    public String updateMessage(@RequestBody Message message){
        if(message.getSex().equals("男")){
            message.setSex("1");
        }else if (message.getSex().equals("女")){
            message.setSex("2");
        }
        int i = messageService.updateMusic(message);
        if (i>=1){
            return "数据批改胜利";
        }else {
            return "数据批改失败,请重试!";
        }
    }

}

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理