Bonjour à tous, je suis incroyable.
Que l'interface soit appelée une ou plusieurs fois, l'idempotence de l'interface garantit que les opérations sur la même ressource ne produiront que le même résultat. Les appels répétés à la même demande d'interface doivent avoir les mêmes résultats qu'une seule demande et ne doivent pas provoquer d'incohérence ou d'effets secondaires.
Aujourd'hui, nous avons utilisé l'intelligence artificielle pour créer une annotation personnalisée afin d'éviter que l'interface ne soit demandée plusieurs fois en 30 secondes, et avons utilisé Redis comme cache.
Sans plus attendre, il suffit de demander :
# 🎜 🎜#Attendez quelques minutes. . . 1. Créez des annotations personnalisées, y compris la durée de la protection de l'interface, l'activation de la protection contre les soumissions répétées, etc. 2. Créez ensuite un intercepteur.
Ici, nous publions le code principal de l'intercepteur :@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();}
#🎜 🎜#
L'explication et l'utilisation donnée à la fin.
Ce qui précède est le code le plus critique.
Connectez-vous à Redis
spring:data:redis:host: 127.0.0.1 port: 6379
Annotations d'utilisation de l'interface
@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>
# 🎜 🎜#
Test de l'interface locale : les requêtes répétées dans les 30 secondes devront être interceptées directement
#🎜 🎜#La CLÉ mise en cache dans Redis est la suivante :
Le le code correspondant se trouve à la fin de l'article, si nécessaire, vous pouvez avoir des relations sexuelles gratuitement !
Solution d'idempotence d'interfaceInterrogons-nous sur la solution d'idempotence d'interface,
#🎜 🎜##🎜🎜 #
Que pensez-vous de cette réponse ?Liens de codes associés, bienvenue sur :
https://www.php.cn/link/94c0915ab3bcbc61c1c61624dd6d7cd5Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!