如何防止重复请求提交
创作时间:
作者:
@小白创作中心
如何防止重复请求提交
引用
1
来源
1.
http://www.cdweb.net/article/pgisji.html
在软件开发中,防止重复请求提交是一个常见的问题,特别是在交易系统、售后维权以及支付系统中,重复请求可能会造成严重的后果。本文将介绍三种有效的解决方案:基于缓存数据状态的验证、利用唯一索引机制的验证以及基于缓存的计数器验证。
背景
在平常开发中,我们经常会面对防止重复请求的问题。当服务端对于请求的响应涉及数据的修改,或状态的变更时,可能会造成极大的危害。重复请求的后果在交易系统、售后维权,以及支付系统中尤其严重。但是很多时候,都是指望着前端来限制,比如提交之后,按钮diseabled之类的,其实这些都是不靠谱的。关键时候还是需要后端来校验。
解决方式
1. 基于缓存数据状态的验证
Redis存储查询轻量快速。在request进来的时候,可以先记录在缓存中。后续进来的request每次进行验证。整个流程处理完成,清除缓存。
if (!CacheExtension.getInstance().AddUnique($"{key}_unique", 1, DateTimeOffset.Now.AddDays(365)))
{
LogExtention.getInstance().WriteCustomLogAsync("", "", true, "上批次还未执行结束");
return ResponseResult.FromError("上批次还未执行结束!");
}
if (!string.IsNullOrEmpty(uniqueKey))
{
CacheExtension.getInstance().Remove(uniqueKey);
}
return ResponseResult.Ok();
2. 利用唯一索引机制的验证
需要原子性操作,想到了数据库的唯一索引。新建一个表,每次request进来则往表里面插入数据, 操作完成后,删除此条记录。
3. 基于缓存的计数器验证
由于数据库的操作比较消耗性能,了解到redis的计数器也是原子性操作。果断采用计数器。既可以提高性能,还不用存储,而且能提升qps的峰值。 每次request进来则新建一个以orderId为key的计数器,然后+1。如果>1(不能获得锁): 说明有操作在进行,删除。如果=1(获得锁): 可以操作。
redis> SET test 20
OK
redis> INCR test
(integer) 21
redis> GET test # 数字值在 Redis 中以字符串的形式保存
"21"
//获取指定的所有计数器
HGETALL counter:user:{userID}
//获取指定的指定计数器
HMGET counter:user:{userID} praiseCnt hostCnt
//指定点赞数+1
HINCRBY counter:user:{userID} praiseCnt
感谢各位的阅读,以上就是“如何防止重复请求提交”的内容了,经过本文的学习后,相信大家对如何防止重复请求提交这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。
热门推荐
ESP32驱动OV7725摄像头 | Arduino IDE
早上起床嘴巴发苦,是怎么回事?5个原因要引起重视
定西市实施马铃薯淀粉加工汁水资源化利用试点项目
“神笔”王铎书法欣赏
多图详细教你注册Google(Gmail)新账号,常见问题和注意事项
中国云厂出海:如何绕过暗礁,找到宝藏
AI赋能BI:创新AIBI技术重塑企业数据分析
首个抗HER2复方皮下制剂赫双妥®纳入国家医保目录
联想台式机主机硬件升级指南:是否值得一试?全面解读升级价值及实操步骤
百年老街“蝶变”记
甜、油腻、咸食物对心脏的影响及预防措施
中医教你如何应对脸颊肌肉下垂和长斑
“钢铁侠”是怎样炼成的?马斯克的跨界传奇人生
“量子纠错”突破性进展!谷歌和中国研究团队打响量子竞速赛
拿奖拿到手软的动画IP,灵笼、秦时明月、罗小黑战记你更喜欢哪个
SwarmBrain:通过大模型玩实时战略游戏《星际争霸II》
《艾尔登法环》强势武器推荐 艾尔登法环轮椅武器推荐
出租车价格是如何计算的?
日本神话:神明、龙、众神的创世起源
JS实现a链接跳转的六种方法
大麻和咖啡因使心律不正风险增加
汽车钣金修复工艺详解:让爱车焕然一新
芬兰语为什么难学
遭遇车祸两年后,林志颖计划将重返赛车场,称“谁也无法阻挡”
小红书虚拟资料销售:解锁五大热门类目,助力内容变现
筹码分布的细节讲解
聂姓起源与发展:历史名人、迁徙分布
王敏幹:中国鲸鱼保护的历史、现状与未来
当抽象棋手柯洁,遇到更抽象的韩国围棋对决
从零开始:如何开发一款属于自己的游戏