Hello, everyone, I am amazing.
No matter whether the interface is called once or multiple times, the idempotence of the interface ensures that operations on the same resource will only produce the same result. Repeated calls to the same interface request multiple times should have the same results as a single request and should not cause inconsistency or side effects.
Today we used artificial intelligence to create a custom annotation to prevent the interface from being requested multiple times within 30 seconds, and used Redis as a cache.
Without further ado, just ask:
After waiting for a few minutes. . .
1. Create custom annotations, including interface protection duration, enabling protection against repeated submissions, etc.
2. Then create the interceptor
Here we Post the core code of the interceptor:
@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {if (handler instanceof HandlerMethod) {HandlerMethod handlerMethod = (HandlerMethod) handler;RepeatSubmit annotation = handlerMethod.getMethodAnnotation(RepeatSubmit.class);if (annotation != null && annotation.enable()) {String key = buildKey(request);if (StringUtils.hasText(redisTemplate.opsForValue().get(key))) {response.getWriter().write("repeat request, please try again later!");return false;} else {redisTemplate.opsForValue().set(key, Arrays.toString(request.getInputStream().readAllBytes()), annotation.timeout(), TimeUnit.SECONDS);}}}return true;} //创建redis 缓存keyprivate String buildKey(HttpServletRequest request) throws IOException, NoSuchAlgorithmException {String key = useRequestMD5 ? hashRequest(request) : request.getRequestURI();return "repeat-submit:" + key;} //对请求做hash运算private String hashRequest(HttpServletRequest request) throws IOException, NoSuchAlgorithmException {byte[] hashBytes = MessageDigest.getInstance("MD5").digest(request.getInputStream().readAllBytes());StringBuilder sb = new StringBuilder();for (byte b : hashBytes) {sb.append(String.format("%02x", b));}return sb.toString();}
3. Register the interceptor
The explanation and usage given at the end.
The above is the most critical code.
Next we connect to Redis. The most streamlined configuration version
spring:data:redis:host: 127.0.0.1 port: 6379
@RestControllerpublic class RepeatTestController {@RepeatSubmit@GetMapping("/hello/mono1")public Mono<string> mono(){return Mono.just("Hello Mono -Java North");}@RepeatSubmit@PostMapping ("/hello/mono1")public Mono<string> mono1(@RequestBody User user){return Mono.just("Hello Mono -Java North-"+user.getName());}}</string></string>
Start a Redis locally, and then start the local SpringBoot project for testing,
Local interface test: Repeated requests within 30 seconds will need to be intercepted directly
The KEY cached in Redis is as follows:
The relevant code is at the end of the article, you can use it for free if you need it!
Let’s ask about the interface idempotence solution,
About What do you think of this answer?
Related code links, welcome to visit:
https://www.php.cn/link/94c0915ab3bcbc61c1c61624dd6d7cd5
The above is the detailed content of Today we are using AI to create an interface to prevent repeated submission of annotations.. For more information, please follow other related articles on the PHP Chinese website!