Home > Database > Redis > How SpringBoot uses AOP+Redis to prevent repeated submission of forms

How SpringBoot uses AOP+Redis to prevent repeated submission of forms

PHPz
Release: 2023-06-03 18:10:04
forward
1101 people have browsed it

    Configuring Redis

    1. Add Redis dependency

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>
    Copy after login

    2. Add redis configuration information

    redis:
      host: 127.0.0.1
      port: 6379
      database: 0
      password:
      # 连接超时时间
      timeout: 10s
    Copy after login

    Configure AOP

    1. Custom annotations

    /**
     * 防止表单重复提交注解
     */
    @Target(ElementType.METHOD) // 注解的作用目标为方法
    @Retention(RetentionPolicy.RUNTIME) // 注解的保留期限为运行时
    public @interface PreventDuplicateSubmission {
        /**
         * 时间(s)
         */
        int time() default 3;
    }
    Copy after login

    2. AOP aspects

    @Aspect // 表明这是一个切面类
    @Component // 表示这是一个Bean
    public class DuplicateSubmissionAspect {
        @Autowired
        private StringRedisTemplate stringRedisTemplate;
        
    // 定义切入点,即标注了@PreventDuplicateSubmission注解的方法
        @Pointcut("@annotation(com.example.demo.annotation.PreventDuplicateSubmission)")
        public void preventDuplicateSubmission() {
        }
    
        @Around("preventDuplicateSubmission()")
        public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
            ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
            assert attributes != null;
            HttpServletRequest request = attributes.getRequest();
            String requestURI = request.getRequestURI();
            String key = requestURI + ":" + JSON.toJSONString(request.getParameterMap());
    
            if (stringRedisTemplate.hasKey(key)) { // 如果Redis中已存在该请求
                throw new RuntimeException("请勿重复提交");
            }
            // 获取注解的参数
            PreventDuplicateSubmission formSubmission = ((MethodSignature) pjp.getSignature()).getMethod().getAnnotation(PreventDuplicateSubmission.class);
            int time = formSubmission.time();
            // 设置请求的key和value,有效期为3秒
            stringRedisTemplate.opsForValue().set(key, "1", time, TimeUnit.SECONDS);
            return pjp.proceed();
        }
    }
    Copy after login

    In the above code, we use the StringRedisTemplate provided by Spring Boot. To connect to Redis, you can inject the object directly through the @Autowired annotation. In the @Around annotation, we use the stringRedisTemplate.hasKey() method to check whether the request already exists in Redis. If it exists, an exception is thrown; if it does not exist, the stringRedisTemplate.opsForValue().set() method is used to set the request. The request is stored in Redis and the expiration time is set to 3 seconds.

    Notes

    You need to pay attention to the following points when using Redis storage requests:

    • Redis needs to be deployed separately. Do not deploy Redis and the application in the same on a machine.

    • The performance of Redis may be reduced compared to the memory storage method, and it needs to be tested and optimized based on the actual situation.

    • If an exception occurs in Redis, it may affect the normal operation of the application, and corresponding fault-tolerance mechanisms need to be added.

    • Redis storage requests need to take into account concurrency issues, which can be solved using Redis distributed locks.

    • If the application requires frequent Redis operations, it may cause the performance of Redis to decrease. Therefore, you need to pay attention to optimizing the configuration and use of Redis, such as using Redis Pipeline and other technologies. Improve the performance of Redis.

    The above is the detailed content of How SpringBoot uses AOP+Redis to prevent repeated submission of forms. For more information, please follow other related articles on the PHP Chinese website!

    Related labels:
    source:yisu.com
    Statement of this Website
    The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
    Popular Tutorials
    More>
    Latest Downloads
    More>
    Web Effects
    Website Source Code
    Website Materials
    Front End Template