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

    文章

    8497

    浏览量

    150834
  • 缓存
    +关注

    关注

    1

    文章

    233

    浏览量

    26649
  • AI
    AI
    +关注

    关注

    87

    文章

    30124

    浏览量

    268410
  • 代码
    +关注

    关注

    30

    文章

    4747

    浏览量

    68349
  • Redis
    +关注

    关注

    0

    文章

    371

    浏览量

    10846
收藏 人收藏

    评论

    相关推荐

    立体智慧仓储解决方案.#云计算

    解决方案智能设备
    学习电子知识
    发布于 :2022年10月06日 19:45:47

    离线计算中的和DataWorks中的相关事项

    考虑到,导致对应的单据有两条确认记录。点此查看原文:http://click.aliyun.com/m/42758/概念这个词在软
    发表于 02-27 13:24

    接口RFID解决方案提升医疗设备实用及使用寿命

    ,而这正是一个双接口RFID解决方案所擅长的领域。作为连接系统内部工作的网关,双接口RFID解决方案与监控设备相连无需纠缠不清的连接线,因此可提高监控仪的实用
    发表于 05-29 06:54

    I/O接口ESD静电防护解决方案

    的危害,为便携式消费电子、电脑、汽车电子产品的I/O接口提供理想的保护解决方案。接下来分享:I/O接口ESD静电保护方案图。I/O
    发表于 10-29 13:43

    HDMI接口静电保护解决方案

    和发射器IC芯片采用的是亚微米CMOS工艺制造而成的,而亚微米CMOS十分地敏感,为此需要借助ESD静电保护器件和ESD静电保护解决方案为其保驾护航。机顶盒STB、电视LCD终端应用极其容易受到ESD
    发表于 12-31 15:57

    有源DASCPRI接口解决方案

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

    在高并发下怎么保证接口

    前言 接口性问题,对于开发人员来说,是一个跟语言无关的公共问题。本文分享了一些解决这类问题非常实用的办法,绝大部分内容我在项目中实践过的,给有需要的小伙伴一个参考。 不知道你有没有遇到过这些场景
    的头像 发表于 05-14 10:23 1780次阅读
    在高并发下怎么保证<b class='flag-5'>接口</b>的<b class='flag-5'>幂</b><b class='flag-5'>等</b><b class='flag-5'>性</b>?

    什么是?关于接口解决方案

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

    分析解决)的方法

    这个概念,是一个数学上的概念,即:f……(f(f(x))) = f(x)。用在计算机领域,指的是系统里的接口或方法对外的一种承诺,使用相同参数对同一资源重复调用某个接口或方法的结果
    的头像 发表于 10-14 10:08 914次阅读

    Spring Boot实现接口的4种方案

    是一个数学与计算机学概念,在数学中某一元运算为时,其作用在任一元素两次后会和其作用一次的结果相同。
    的头像 发表于 11-08 10:21 975次阅读

    什么是的实现原理

    在编程中一个操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。函数,或
    发表于 01-05 10:40 6031次阅读

    一个注解,优雅的实现接口

    除了查询和删除之外,还有更新操作,同样的更新操作在大多数场景下也是天然的,其例外是也会存在ABA的问题,更重要的是,比如执行update table set a = a + 1 where v = 1这样的更新就非等了。
    的头像 发表于 08-26 14:36 865次阅读
    一个注解,优雅的实现<b class='flag-5'>接口</b><b class='flag-5'>幂</b><b class='flag-5'>等</b><b class='flag-5'>性</b>!

    实用RTD接口解决方案

    电子发烧友网站提供《实用RTD接口解决方案.pdf》资料免费下载
    发表于 11-16 16:05 1次下载
    实用RTD<b class='flag-5'>接口</b><b class='flag-5'>解决方案</b>

    为什么要实现校验 如何实现接口校验

    前端重复提交表单:在填写一些表格时候,用户填写完成提交,很多时候会因网络波动没有及时对用户做出提交成功响应,致使用户认为没有成功提交,然后一直点提交按钮,这时就会发生重复提交表单请求。
    的头像 发表于 02-20 14:14 1138次阅读

    探索LabVIEW编程接口原理与实践

    原来是数学上的概念,在编程领域可以理解为:多次请求某一个资源或执行某一个操作时应该具有唯一同样结果,也就是说,其任意多次执行对资源
    的头像 发表于 02-29 10:24 555次阅读
    探索LabVIEW编程<b class='flag-5'>接口</b><b class='flag-5'>幂</b><b class='flag-5'>等</b><b class='flag-5'>性</b>原理与实践