自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

今天用AI搞一個(gè)防止接口重復(fù)提交注解

人工智能
接口冪等性是指無(wú)論調(diào)用接口的次數(shù)是一次還是多次,對(duì)于同一資源的操作都只會(huì)產(chǎn)生一次結(jié)果。換句話說(shuō),多次重復(fù)調(diào)用相同的接口請(qǐng)求應(yīng)該具有與單次請(qǐng)求相同的效果,不會(huì)導(dǎo)致不一致或副作用的發(fā)生。

哈嘍,大家好,我是了不起。

接口冪等性是指無(wú)論調(diào)用接口的次數(shù)是一次還是多次,對(duì)于同一資源的操作都只會(huì)產(chǎn)生一次結(jié)果。換句話說(shuō),多次重復(fù)調(diào)用相同的接口請(qǐng)求應(yīng)該具有與單次請(qǐng)求相同的效果,不會(huì)導(dǎo)致不一致或副作用的發(fā)生。

今天我們使用AI幫我們?nèi)?chuàng)建一個(gè)自定義注解,可以防止接口30秒內(nèi)的重復(fù)請(qǐng)求,并采用Redis作為緩存。

提問(wèn)

話不多說(shuō),直接提問(wèn):

圖片

等待數(shù)分鐘后。。。

1.創(chuàng)建自定義注解 其中包括接口保護(hù)時(shí)長(zhǎng),開(kāi)啟防止重復(fù)提交保護(hù)等。

圖片

2.然后創(chuàng)建攔截器

圖片

這里我們貼出攔截器的核心代碼:

@Override
    public 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;
    }
 //創(chuàng)建redis 緩存key
    private String buildKey(HttpServletRequest request) throws IOException, NoSuchAlgorithmException {
        String key = useRequestMD5 ? hashRequest(request) : request.getRequestURI();
        return "repeat-submit:" + key;
    }

 //對(duì)請(qǐng)求做hash運(yùn)算
    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.注冊(cè)攔截器

圖片

最后給出的解釋與使用方法。

圖片

上面就是最關(guān)鍵的代碼了。

接入Redis

下面我們接入Redis。最精簡(jiǎn)的配置版本:

spring:
  data:
    redis:
      host: 127.0.0.1 
      port: 6379

接口使用注解

@RestController
public 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());
    }
}

本地起一個(gè)Redis,然后啟動(dòng)本地的SpringBoot項(xiàng)目進(jìn)行測(cè)試。

圖片

本地接口測(cè)試:30秒內(nèi)重復(fù)請(qǐng)求會(huì)需要直接被攔截

圖片

Redis中緩存的KEY如下:

圖片

以上就是利用AI為我們生成的一個(gè)簡(jiǎn)單的接口短時(shí)間內(nèi)防止重復(fù)提交的注解代碼!

相關(guān)代碼在文章末尾,需要的話可以白嫖哈!

接口冪等性解決方案

下面問(wèn)一下接口冪等性解決方案,

圖片

關(guān)于這個(gè)回答,大家覺(jué)得怎么樣?

相關(guān)代碼鏈接,歡迎來(lái)嫖:

https://github.com/javatechnorth/java-study-note/tree/master/isv-repeat-submit-spring-boot-starter

責(zé)任編輯:武曉燕 來(lái)源: Java技術(shù)指北
相關(guān)推薦

2022-11-11 07:34:43

2022-11-15 07:39:48

2022-11-17 07:43:13

2022-06-10 13:03:44

接口重試while

2024-06-06 08:46:37

2023-08-24 08:02:19

冪等性API請(qǐng)求

2021-04-28 14:31:35

Dubbo接口日志

2013-11-13 14:39:53

表單提交開(kāi)發(fā)

2013-11-13 11:01:14

表單表單重復(fù)提交表單策略

2025-03-11 08:20:58

2024-06-21 09:19:45

代碼接口重復(fù)請(qǐng)求開(kāi)發(fā)

2020-07-17 07:59:55

數(shù)據(jù)

2024-11-08 15:56:36

2022-06-21 14:44:38

接口數(shù)據(jù)脫敏

2024-11-07 10:55:26

2022-05-16 10:45:22

Redis接口限流緩存

2020-06-22 07:47:46

提交面試官訂單

2025-02-23 08:00:00

冪等性Java開(kāi)發(fā)

2023-08-01 08:54:02

接口冪等網(wǎng)絡(luò)

2020-06-22 07:55:28

接口爬蟲(chóng)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)