Rumah > Artikel > Peranti teknologi > Hari ini kami menggunakan AI untuk mencipta antara muka untuk mengelakkan penyerahan anotasi berulang.
Helo, semua, saya hebat.
Tidak kira berapa kali antara muka dipanggil sekali atau beberapa kali, penyahdayaan antara muka memastikan bahawa operasi pada sumber yang sama hanya akan menghasilkan hasil yang sama. Panggilan berulang kepada permintaan antara muka yang sama beberapa kali harus mempunyai hasil yang sama seperti permintaan tunggal dan tidak boleh menyebabkan ketidakkonsistenan atau kesan sampingan.
Hari ini kami menggunakan kecerdasan buatan untuk mencipta anotasi tersuai untuk menghalang antara muka daripada diminta beberapa kali dalam masa 30 saat dan menggunakan Redis sebagai cache.
Jangan banyak cakap, tanya terus:
Setelah menunggu beberapa minit . . .
1 Buat anotasi tersuai, termasuk tempoh perlindungan antara muka, menghidupkan perlindungan terhadap penyerahan berulang, dsb.
2 Kemudian buat pemintas
Di sini kita Siarkan kod teras pemintas:
@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 Daftarkan pemintas
Penjelasan dan kaedah penggunaan yang diberikan pada penghujung. .
Kod di atas ialah kod yang paling kritikal.
Seterusnya kita sambung ke Redis. Versi konfigurasi yang paling diperkemas
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>
Mulakan Redis secara setempat, dan kemudian mulakan projek SpringBoot tempatan untuk ujian,
Ujian antara muka tempatan: Permintaan berulang dalam masa 30 saat perlu dipintas terus
KEY yang dicache dalam Redis ialah seperti berikut:
Kod yang berkaitan ada di penghujung artikel, anda boleh menggunakannya secara percuma jika anda memerlukannya!
Mari kita tanya tentang penyelesaian mati pucuk antara muka,
Tentang Apa pendapat anda jawapan ini?
Pautan kod berkaitan, dialu-alukan untuk melawat:
https://www.php.cn/link/94c0915ab3bcbc61c1c61624dd6d7cd5
Atas ialah kandungan terperinci Hari ini kami menggunakan AI untuk mencipta antara muka untuk mengelakkan penyerahan anotasi berulang.. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!