<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>
redis: host: 127.0.0.1 port: 6379 database: 0 password: # 连接超时时间 timeout: 10s
/** * 防止表单重复提交注解 */ @Target(ElementType.METHOD) // 注解的作用目标为方法 @Retention(RetentionPolicy.RUNTIME) // 注解的保留期限为运行时 public @interface PreventDuplicateSubmission { /** * 时间(s) */ int time() default 3; }
@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(); } }
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.
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!