SpringBoot自定义注解+AOP+redis实现防接口幂等性重复提交,从概念到实战

网站建设4年前发布
39 0 0

2023030615343505d2a0744edfdfb967c682eb69f7c8434bf529968,在面试中,经常会有一道经典面试题,那就是:怎么防止接口重复提交?小编也是背过的,好几种方式,但是一直没有实战过,做多了管理系统,发现这个事情真的没有过多的重视。最近在测试过程中,发现了多次提交会保存两条数据,进而导致程序出现问题!,问题已经出现我们就解决一下吧!!,本次解决是对于高并发不高的情况,适用于一般的管理系统,给出的解决方案!!高并发的还是建议加分布式锁!!,下面我们来聊聊幂等性是什么?,接口幂等性就是用户对于同一操作发起的一次请求或者多次请求的结果是一致的,不会因为多次点击而产生了副作用;比如说经典的支付场景:用户购买了商品支付扣款成功,但是返回结果的时候网络异常,此时钱已经扣了,用户再次点击按钮,此时会进行第二次扣款,返回结果成功,用户查询余额返发现多扣钱了,流水记录也变成了条,这就没有保证接口的幂等性;可谓:商家美滋滋,买家骂咧咧!,防接口重复提交,这是必须要做的一件事情!,以常用的四种来分析哈!,所以我们要解决的就是POST请求!,大概主流的解决方案:,小编的解决方案就是redis的set机制!,同一个用户,任何POST保存相关的接口,1s内只能提交一次。,完全使用后端来进行控制,前端可以加限制,不过体验不好!,后端通过自定义注解,在需要防幂等接口上添加注解,利用AOP切片,减少和业务的耦合!在切片中获取用户的token、user_id、url构成redis的唯一key!第一次请求会先判断key是否存在,如果不存在,则往redis添加一个主键key,设置过期时间;,如果有异常会主动删除key,万一没有删除失败,等待1s,redis也会自动删除,时间误差是可以接受的!第二个请求过来,先判断key是否存在,如果存在,则是重复提交,返回保存信息!,SpringBoot版本为2.7.4。,异常信息大家换成自己想抛的异常,小编这里就没有详细划分异常,就是为了写博客而记录的不完美项目哈!,这是残缺版,大家不要模仿!,输入请求:
http://localhost:8087/test/saveSysLog请求参数:,发送请求两次:,20230306153728b6961f5140a2c0e1977098e9f76101f881b7a8733,只会有一条保存成功!,20230306153438d5e3cbe905a6de1ef790414bf9403688da932b413,在10s会自动删除,就可以在次提交!,20230306153729b8430f663f262335660469d71dadfda4cb4fa4344,20230306153441b793c5273a5ead2cdb5386d8655312d979ee97677,这样就解决了幂等性问题,再也不会有错误数据了,减少了一个bug提交!这是一个都要重视的问题,必须要解决,不然可能会出现问题。

© 版权声明

相关文章