0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于接口冪等性解決方案

科技綠洲 ? 來(lái)源:Java技術(shù)指北 ? 作者:Java技術(shù)指北 ? 2023-09-30 16:27 ? 次閱讀

接口冪等性是指無(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é)得怎么樣?

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 接口
    +關(guān)注

    關(guān)注

    33

    文章

    8257

    瀏覽量

    149951
  • 緩存
    +關(guān)注

    關(guān)注

    1

    文章

    223

    瀏覽量

    26579
  • AI
    AI
    +關(guān)注

    關(guān)注

    87

    文章

    28876

    瀏覽量

    266219
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4671

    瀏覽量

    67765
  • Redis
    +關(guān)注

    關(guān)注

    0

    文章

    368

    瀏覽量

    10780
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    立體智慧倉(cāng)儲(chǔ)解決方案.#云計(jì)算

    解決方案智能設(shè)備
    學(xué)習(xí)電子知識(shí)
    發(fā)布于 :2022年10月06日 19:45:47

    離線計(jì)算中的和DataWorks中的相關(guān)事項(xiàng)

    考慮到,導(dǎo)致對(duì)應(yīng)的單據(jù)有兩條確認(rèn)記錄。點(diǎn)此查看原文:http://click.aliyun.com/m/42758/概念這個(gè)詞在軟
    發(fā)表于 02-27 13:24

    接口RFID解決方案提升醫(yī)療設(shè)備實(shí)用及使用壽命

    ,而這正是一個(gè)雙接口RFID解決方案所擅長(zhǎng)的領(lǐng)域。作為連接系統(tǒng)內(nèi)部工作的網(wǎng)關(guān),雙接口RFID解決方案與監(jiān)控設(shè)備相連無(wú)需糾纏不清的連接線,因此可提高監(jiān)控儀的實(shí)用
    發(fā)表于 05-29 06:54

    I/O接口ESD靜電防護(hù)解決方案

    的危害,為便攜式消費(fèi)電子、電腦、汽車電子產(chǎn)品的I/O接口提供理想的保護(hù)解決方案。接下來(lái)分享:I/O接口ESD靜電保護(hù)方案圖。I/O
    發(fā)表于 10-29 13:43

    HDMI接口靜電保護(hù)解決方案

    和發(fā)射器IC芯片采用的是亞微米CMOS工藝制造而成的,而亞微米CMOS十分地敏感,為此需要借助ESD靜電保護(hù)器件和ESD靜電保護(hù)解決方案為其保駕護(hù)航。機(jī)頂盒STB、電視LCD終端應(yīng)用極其容易受到ESD
    發(fā)表于 12-31 15:57

    有源DASCPRI接口解決方案

    在此前合作的基礎(chǔ)上,康普與諾基亞再次攜手開(kāi)發(fā)了一款旨在降低基站收發(fā)器系統(tǒng)(BTS)與有源分布式天線系統(tǒng)(DAS)之間的接口復(fù)雜解決方案。
    發(fā)表于 08-20 16:19 ?719次閱讀

    在高并發(fā)下怎么保證接口?

    前言 接口性問(wèn)題,對(duì)于開(kāi)發(fā)人員來(lái)說(shuō),是一個(gè)跟語(yǔ)言無(wú)關(guān)的公共問(wèn)題。本文分享了一些解決這類問(wèn)題非常實(shí)用的辦法,絕大部分內(nèi)容我在項(xiàng)目中實(shí)踐過(guò)的,給有需要的小伙伴一個(gè)參考。 不知道你有沒(méi)有遇到過(guò)這些場(chǎng)景
    的頭像 發(fā)表于 05-14 10:23 ?1712次閱讀
    在高并發(fā)下怎么保證<b class='flag-5'>接口</b>的<b class='flag-5'>冪</b><b class='flag-5'>等</b><b class='flag-5'>性</b>?

    什么是?關(guān)于接口解決方案

    這里的樂(lè)觀鎖指的是用樂(lè)觀鎖的原理去實(shí)現(xiàn),為數(shù)據(jù)字段增加一個(gè)version字段,當(dāng)數(shù)據(jù)需要更新時(shí),先去數(shù)據(jù)庫(kù)里獲取此時(shí)的version版本號(hào)
    發(fā)表于 10-09 10:19 ?1849次閱讀

    分析解決)的方法

    這個(gè)概念,是一個(gè)數(shù)學(xué)上的概念,即:f……(f(f(x))) = f(x)。用在計(jì)算機(jī)領(lǐng)域,指的是系統(tǒng)里的接口或方法對(duì)外的一種承諾,使用相同參數(shù)對(duì)同一資源重復(fù)調(diào)用某個(gè)接口或方法的結(jié)果
    的頭像 發(fā)表于 10-14 10:08 ?856次閱讀

    Spring Boot實(shí)現(xiàn)接口的4種方案

    是一個(gè)數(shù)學(xué)與計(jì)算機(jī)學(xué)概念,在數(shù)學(xué)中某一元運(yùn)算為時(shí),其作用在任一元素兩次后會(huì)和其作用一次的結(jié)果相同。
    的頭像 發(fā)表于 11-08 10:21 ?910次閱讀

    什么是?的實(shí)現(xiàn)原理

    在編程中一個(gè)操作的特點(diǎn)是其任意多次執(zhí)行所產(chǎn)生的影響均與一次執(zhí)行的影響相同。函數(shù),或
    發(fā)表于 01-05 10:40 ?5695次閱讀

    一個(gè)注解,優(yōu)雅的實(shí)現(xiàn)接口

    除了查詢和刪除之外,還有更新操作,同樣的更新操作在大多數(shù)場(chǎng)景下也是天然的,其例外是也會(huì)存在ABA的問(wèn)題,更重要的是,比如執(zhí)行update table set a = a + 1 where v = 1這樣的更新就非等了。
    的頭像 發(fā)表于 08-26 14:36 ?747次閱讀
    一個(gè)注解,優(yōu)雅的實(shí)現(xiàn)<b class='flag-5'>接口</b><b class='flag-5'>冪</b><b class='flag-5'>等</b><b class='flag-5'>性</b>!

    實(shí)用RTD接口解決方案

    電子發(fā)燒友網(wǎng)站提供《實(shí)用RTD接口解決方案.pdf》資料免費(fèi)下載
    發(fā)表于 11-16 16:05 ?1次下載
    實(shí)用RTD<b class='flag-5'>接口</b><b class='flag-5'>解決方案</b>

    為什么要實(shí)現(xiàn)校驗(yàn) 如何實(shí)現(xiàn)接口校驗(yàn)

    前端重復(fù)提交表單:在填寫一些表格時(shí)候,用戶填寫完成提交,很多時(shí)候會(huì)因網(wǎng)絡(luò)波動(dòng)沒(méi)有及時(shí)對(duì)用戶做出提交成功響應(yīng),致使用戶認(rèn)為沒(méi)有成功提交,然后一直點(diǎn)提交按鈕,這時(shí)就會(huì)發(fā)生重復(fù)提交表單請(qǐng)求。
    的頭像 發(fā)表于 02-20 14:14 ?1020次閱讀

    探索LabVIEW編程接口原理與實(shí)踐

    原來(lái)是數(shù)學(xué)上的概念,在編程領(lǐng)域可以理解為:多次請(qǐng)求某一個(gè)資源或執(zhí)行某一個(gè)操作時(shí)應(yīng)該具有唯一同樣結(jié)果,也就是說(shuō),其任意多次執(zhí)行對(duì)資源
    的頭像 發(fā)表于 02-29 10:24 ?478次閱讀
    探索LabVIEW編程<b class='flag-5'>接口</b><b class='flag-5'>冪</b><b class='flag-5'>等</b><b class='flag-5'>性</b>原理與實(shí)踐