SpringBoot自定义注解AOPredis实现防接口重复提交,概念到实战
一、前言
在面试中,经常会有一道经典面试题,那就是: 怎么防止接口重复提交?
小编也是背过的,好几种方式,但是一直没有实战过,做多了管理系统,发现这个事情真的没有过多的重视。
最近在测试过程中,发现了多次提交会保存两条数据,进而导致程序出现问题!
问题已经出现我们就解决一下吧!!
本次解决是对于高并发不高的情况,适用于一般的管理系统,给出的解决方案!!高并发的还是建议加分布式锁!!
下面我们来聊聊幂等性是什么? 二、什么是幂等性
接口幂等性就是用户对于 同一操作 发起的一次请求或者多次请求 的结果是一致的 ,不会因
为多次点击而产生了副作用;
比如说经典的支付场景:用户购买了商品支付扣款成功,但是返回结果的时候网络异常,此时钱已经扣了,用户再次点击按钮,此时会进行第二次扣款,返回结果成功,用户查询余额返发现多扣钱了,流水记录也变成了条,这就没有保证接口的幂等性;
可谓:商家美滋滋,买家骂咧咧!!
防接口重复提交,这是必须要做的一件事情!! 三、REST风格与幂等性
以常用的四种来分析哈!
REST
是否支持幂等
SQL例子
GET
是
SELECT * FROM table WHER id = 1
PUT
是
UPDATE table SET age=18 WHERE id = 1
DELETE
是
DELETE FROM table WHERE id = 1
POST
否
INSERT INTO table (id,age) VALUES(1,21)
所以我们要解决的就是 POST 请求!四、解决思路
大概主流的解决方案: token机制(前端带着在请求头上带着标识,后端验证) 加锁机制 数据库悲观锁(锁表) 数据库乐观锁(version号进行控制) 业务层分布式锁(加分布式锁redisson) 全局唯一索引机制 redis的set机制 前端按钮加限制
小编的解决方案就是redis的set机制!
同一个用户,任何POST保存相关的接口,1s内只能提交一次。
完全使用后端来进行控制,前端可以加限制,不过体验不好!
后端通过自定义注解,在需要防幂等接口上添加注解,利用AOP切片,减少和业务的耦合!
在切片中获取用户的 token、user_id、url 构成redis的唯一key!
第一次请求会先判断key是否存在,如果不存在,则往redis添加一个主键key,设置过期时间;
如果有异常会主动删除key,万一没有删除失败,等待1s,redis也会自动删除,时间误差是可以接受的!
第二个请求过来,先判断key是否存在,如果存在,则是重复提交,返回保存信息!! 五、实战
SpringBoot版本为 2.7.4 1. 导入依赖 org.springframework.boot spring-boot-starter-data-redis org.projectlombok lombok 1.18.2 org.springframework.boot spring-boot-starter-aop org.springframework.boot spring-boot-starter-web com.alibaba druid-spring-boot-starter 1.1.16 org.springframework.boot spring-boot-starter-jdbc mysql mysql-connector-java com.baomidou mybatis-plus-boot-starter 3.5.1 org.springframework.boot spring-boot-starter-test test 2. 编写ymlserver: port: 8087 spring: redis: host: localhost port: 6379 password: 123456 datasource: #使用阿里的Druid type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://127.0.0.1:3306/test?serverTimezone=UTC username: root password: 3. redis序列化/** * @author wangzhenjun * @date 2022/11/17 15:20 */ @Configuration public class RedisConfig { @Bean @SuppressWarnings(value = { "unchecked", "rawtypes" }) public RedisTemplate
寒衣节是隔开生者与逝者的一扇门昨夜,一夜未眠望着窗外天上的星星,我情不自禁的流泪了。这星星好像我的母亲,无时无刻不在想她。又是一年寒衣节,你在天上冷不冷,捎去的衣服都收到了吗?这是逝者的十月一,与国庆节相比,它
方便面巨头倒下从20亿巅峰到贱卖,只因为老板太自信方便面巨头真栽了!3年把公司从年销20亿干倒闭凭野心搞垮自二十一世纪初,康师傅统一两家企业垄断了方便面80的市场,剩余的20也被华龙白象南街村等小品牌占据。很明显,在这个充满竞争和
甲钴胺不只修复神经,还对这5种疾病有效,早知早好相信很多人都听说过神经炎,甚至有一些老人受到神经炎的影响,比如有的患者刚开始会感觉到耳后下颌角有疼痛,之后出现面部疼痛和歪斜,这就是面部神经炎症。治疗面部神经炎的药物包含了甲钴胺,
金彭推出新电动三轮车,加大车厢设计,载重量高,提速爬坡更快对于很多用户来说,近两年在选择电动三轮车时,首要考虑的性能就是载重及爬坡能力。但对于大多数车型而言,很多电动三轮车都存在载重低且提速爬坡差等情况。对此,今天来带大家看一款新电动三轮
米芾变成灵魂画手,这个长得像名画呐喊的字是啥?扬子晚报紫牛新闻记者沈昭对于书法爱好者们来说,临帖是必做功课,也有不少人喜欢在网上分享自己临帖的过程,交流学书经验。这两日,一个奇特的字破圈了,在视频中网友所临写的这个字看起来真是
退休后最惬意的活法放下身段,过闲云野鹤的生活,余生就会安澜有人说人生如茶,第一道苦若生命,第二道甜似爱情,第三道淡如清风。走进迟暮的年纪,见识过大风大浪,经历过雨雪风霜,看淡尔虞我诈,看开悲欢离合,看透世事变动,最后发现淡若清风,才是人生
慢慢来,等一下你的灵魂我们生活在一个日新月异竞争激烈的时代,忙碌的工作学习家务一直缠绕着我们的灵魂,活得像一个被上了发条的机器人,每天为完成各种任务指标而努力,渐渐地在生活中迷失了自我,找不到生活的真正
这宁红夜COS太绝了!什么灵魂精华都不重要,和本人长得一模一样提起以武侠吃鸡风靡全球的国产多人竞技游戏永劫无间,相信不少人对它的大名如雷贯耳。自打去年暑假期间上线后,就深得海内外玩家和顶流主播们的喜爱,仅短短半年时间,就成功售卖了超1000万
大龄剩女真的注定要孤独一生吗?大龄剩女真的注定要孤独一生吗?大龄剩女,顾名思义就是年龄大的剩女。说到大龄剩女我们很多人都会想到一个词剩女,就会想到孤独一生。而大龄剩女也不能够否认自己一生需要面对无数次婚姻和爱情
阿圭罗希望阿根廷在世界杯夺冠,关键战将会是14决赛直播吧10月25日讯尽管如今已经退役,但阿圭罗对足球依然重返热忱,尤其对阿根廷国家队。在一次接受采访时,阿圭罗谈论了对阿根廷国家队在卡塔尔世界杯上表现的期望。阿圭罗说道我希望阿根廷
世界上最脏的人去世曾60年不洗澡据英国镜报10月25日报道,伊朗男子AmouHaji因60年不洗澡,被称为世界上最脏的人。当地时间10月23日,Haji在伊朗南部的法尔斯省一个名叫Dejgah的村庄中去世,享年9