0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于接口幂等性解决方案

科技绿洲 来源:Java技术指北 作者:Java技术指北 2023-09-30 16:27 次阅读

接口幂等性是指无论调用接口的次数是一次还是多次,对于同一资源的操作都只会产生一次结果。换句话说,多次重复调用相同的接口请求应该具有与单次请求相同的效果,不会导致不一致或副作用的发生。

今天我们使用AI帮我们去创建一个自定义 注解 ,可以防止接口30秒内的重复请求,并采用Redis作为缓存。

提问

话不多说,直接提问:

图片

等待数分钟后。。。

1.创建自定义注解 其中包括接口保护时长,开启防止重复提交保护等。

图片

2.然后创建拦截器

图片

这里我们贴出拦截器的核心代码:

@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;
    }
 //创建redis 缓存key
    private 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.注册拦截器

图片

最后给出的解释与使用方法。

上面就是最关键的代码了。

接入Redis

下面我们接入Redis。最精简的配置版本

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

本地起一个Redis,然后启动本地的SpringBoot项目进行测试,

图片

本地接口测试:30秒内重复请求会需要直接被拦截

图片

Redis中缓存的KEY如下:

图片

以上就是利用AI为我们生成的一个简单的接口短时间内防止重复提交的注解代码!

相关代码在文章末尾,需要的话可以白嫖哈!

接口幂等性解决方案

下面问一下接口幂等性解决方案,

图片

关于这个回答,大家觉得怎么样?

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 接口
    +关注

    关注

    33

    文章

    7972

    浏览量

    149249
  • 缓存
    +关注

    关注

    1

    文章

    222

    浏览量

    26492
  • AI
    AI
    +关注

    关注

    87

    文章

    27513

    浏览量

    265163
  • 代码
    +关注

    关注

    30

    文章

    4601

    浏览量

    67342
  • Redis
    +关注

    关注

    0

    文章

    366

    浏览量

    10567
收藏 人收藏

    评论

    相关推荐

    TI高精度接口抗EMI干扰解决方案

    2.4GHz是一种目前被普遍使用的频率,用于蜂窝电话、WiFi、工业通信等,在这样的高精度应用中,产品所面临的挑战之一就是如何使信号路径免受这种辐射噪声的影响。
    发表于 11-17 10:09 1184次阅读

    HDMI接口的ESD保护电路及解决方案

    HDMI接口的ESD保护电路及解决方案 RClamp0524P,具有低电
    发表于 11-20 09:17 3425次阅读
    HDMI<b class='flag-5'>接口</b>的ESD保护电路及<b class='flag-5'>解决方案</b>

    创意推出全方面高速接口量产解决方案

    创意电子(Globalunichip)宣布推出每秒千兆位(Gbps)等级的高速接口全方位量产解决方案,包含了完整的硅智财(I
    发表于 01-01 15:18 740次阅读

    莱迪思USB 3.1 Type-C接口供电解决方案加快USB接口开发

    美国俄勒冈州希尔斯波罗市 — 2014年9月9日 —莱迪思半导体公司(NASDAQ: LSCC)——超低功耗、小尺寸客制化解决方案市场的领导者,今日宣布推出USB 3.1 Type-C接口供电解决方案,使得制造商能够立即开始USB 3.1 Type-C
    发表于 09-11 16:35 2716次阅读

    SPI接口控制的模拟开关解决方案详解

    设计一个要求高通道密度的系统时,例如在测试仪器仪表中,电路板上通常需要包括大量开关。当使用并行接口控制的开关时,控制开关所需的逻辑线路以及用于生成GPIO控制信号的串行转并行转换器会占用很大
    的头像 发表于 07-10 15:14 6778次阅读
    SPI<b class='flag-5'>接口</b>控制的模拟开关<b class='flag-5'>解决方案</b>详解

    基于Dialogic HMP与DNI PSTN接口模块呼叫中心解决方案

    新太科技所服务的该客户为国内著名的IT培训学院,学院传统的咨询电话是一种纯手工的方式,效率极低;另外,学院在全国有124个办事处,通过原有的呼叫中心进行通信,话费成本高昂,且处理来电咨询以及进行电话营销都极其不便。因此,学院希望能够建设一个经济、高效、便于扩容的IP呼叫中心,并使其能够发挥营销中心的作用。
    发表于 12-12 05:06 1312次阅读
    基于Dialogic HMP与DNI PSTN<b class='flag-5'>接口</b>模块呼叫中心<b class='flag-5'>解决方案</b>

    康普推出开放接口、集成天线解决方案,进军固定无线网络市场

    通过推出一种基于xRAN开放接口规格的新型集成天线解决方案,全球领先的通信网络基础设施解决方案提供商康普将进军固定无线网络接入市场。开放接口使无线网络运营商能够混合搭配来自多个供应商的
    发表于 02-28 15:11 205次阅读

    基于SPI接口提高通道密度的解决方案

    测试设备中的通道数最大化至关重要,因为通道越多,可以并行测试的器件就越多,进而压缩最终客户的测试时间和成本。测试仪通过开关来分享其资源以支持多个被测器件 (DUT),故开关是增加通道数的关键元件。但是,并行控制的开关数量越多,控制线路也就越多,占用的电路板空间相应地增加,这严重制约了可以实现的通道密度。
    发表于 04-01 14:03 1123次阅读
    基于SPI<b class='flag-5'>接口</b>提高通道密度的<b class='flag-5'>解决方案</b>

    基于DSP芯片的接口转换器的设计解决方案

    。考虑到以太网组网技术的易于理解、实现、管理和维护,且成本低廉、网络拓扑结构灵活的优点,应用以太网组网技术来搭建数据交互的平台。其中的关键就是接口转换器的实现。
    发表于 04-04 17:48 937次阅读
    基于DSP芯片的<b class='flag-5'>接口</b>转换器的设计<b class='flag-5'>解决方案</b>

    有源DASCPRI接口解决方案

    在此前合作的基础上,康普与诺基亚再次携手开发了一款旨在降低基站收发器系统(BTS)与有源分布式天线系统(DAS)之间的接口复杂性的解决方案
    发表于 08-20 16:19 694次阅读

    ADL5382正交I/Q解调器与AD9262 16位连续时间Sigma-Delta ADC的接口,作为RF到位的解决方案

    ADL5382正交I/Q解调器与AD9262 16位连续时间Sigma-Delta ADC的接口,作为RF到位的解决方案
    发表于 05-19 12:34 1次下载
    ADL5382正交I/Q解调器与AD9262 16位连续时间Sigma-Delta ADC的<b class='flag-5'>接口</b>,作为RF到位的<b class='flag-5'>解决方案</b>

    type-c接口同时充电+听歌解决方案的分析

    LDR6028 SOP8 是乐得瑞科技针对 USB Type-C 标准中的 Bridge 设备而开发的 USB-C DRP 接口 USB PD 通信芯片。具备切换 Data Role 功能,实现
    发表于 11-12 14:22 3142次阅读
    type-c<b class='flag-5'>接口</b>同时充电+听歌<b class='flag-5'>解决方案</b>的分析

    什么是幂等性?关于接口幂等性的解决方案

    这里的乐观锁指的是用乐观锁的原理去实现,为数据字段增加一个version字段,当数据需要更新时,先去数据库里获取此时的version版本号
    发表于 10-09 10:19 1726次阅读

    AN4775_从USB2.0接口到USB_Type-C接口的基础和低成本STM32解决方案

    AN4775_从USB2.0接口到USB_Type-C接口的基础和低成本STM32解决方案
    发表于 11-21 17:07 6次下载
    AN4775_从USB2.0<b class='flag-5'>接口</b>到USB_Type-C<b class='flag-5'>接口</b>的基础和低成本STM32<b class='flag-5'>解决方案</b>

    TPD2E009高速(6 Gbps)差分接口双通道ESD解决方案

    电子发烧友网站提供《TPD2E009高速(6 Gbps)差分接口双通道ESD解决方案.pdf》资料免费下载
    发表于 07-02 09:51 0次下载
    TPD2E009高速(6 Gbps)差分<b class='flag-5'>接口</b>双通道ESD<b class='flag-5'>解决方案</b>