这篇文章主要讲解了“如何防止重复请求提交”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何防止重复请求提交”吧!
成都创新互联公司主要从事网站设计、做网站、网页设计、企业做网站、公司建网站等业务。立足成都服务港闸,十载网站建设经验,价格优惠、服务专业,欢迎来电咨询建站服务:18980820575
背景
在平常开发中,我们经常会面对防止重复请求的问题。当服务端对于请求的响应涉及数据的修改,或状态的变更时,可能会造成极大的危害。重复请求的后果在交易系统、售后维权,以及支付系统中尤其严重。但是很多时候,都是指望着前端来限制,比如提交之后,按钮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
感谢各位的阅读,以上就是“如何防止重复请求提交”的内容了,经过本文的学习后,相信大家对如何防止重复请求提交这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是创新互联,小编将为大家推送更多相关知识点的文章,欢迎关注!
新闻标题:如何防止重复请求提交
文章来源:http://scgulin.cn/article/pgisji.html