Hallo zusammen, ich bin großartig.
Unabhängig davon, wie oft die Schnittstelle einmal oder mehrmals aufgerufen wird, stellt die Idempotenz der Schnittstelle sicher, dass Vorgänge auf derselben Ressource nur zum gleichen Ergebnis führen. Wiederholte Aufrufe derselben Schnittstellenanforderung mehrmals sollten die gleichen Ergebnisse wie eine einzelne Anforderung haben und keine Inkonsistenzen oder Nebenwirkungen verursachen.
Heute haben wir mithilfe künstlicher Intelligenz eine benutzerdefinierte Anmerkung erstellt, um zu verhindern, dass die Schnittstelle innerhalb von 30 Sekunden mehrmals angefordert wird, und Redis als Cache verwendet.
Sagen Sie nicht viel, fragen Sie einfach direkt:
Warten Sie ein paar Minuten. . .
1. Erstellen Sie benutzerdefinierte Anmerkungen, einschließlich der Dauer des Schnittstellenschutzes, der Aktivierung des Schutzes vor wiederholten Übermittlungen usw.
2. Dann erstellen Sie den Interceptor
Hier veröffentlichen wir den Kerncode des Interceptors:
@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
Die letzte Erklärung gegeben und Verwendung.
Das Obige ist der kritischste Code.
Mit Redis verbinden
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>
Lokaler Schnittstellentest: Wiederholte Anforderungen innerhalb von 30 Sekunden müssen abgefangen werden direkt
Der in Redis zwischengespeicherte SCHLÜSSEL lautet wie folgt:
Der entsprechende Code befindet sich am Ende des Artikels. Sie können ihn bei Bedarf kostenlos verwenden!
Schnittstellen-Idempotenz-Lösung
Lassen Sie uns nach der Schnittstellen-Idempotenz-Lösung fragen:Was denken Sie über diese Antwort?
Verwandte Code-Links, willkommen zu besuchen:
https://www.php.cn/link/94c0915ab3bcbc61c1c61624dd6d7cd5
Das obige ist der detaillierte Inhalt vonHeute verwenden wir KI, um eine Schnittstelle zu erstellen, die das wiederholte Einreichen von Anmerkungen verhindert.. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!