這篇文章主要講解了“如何防止重復(fù)請(qǐng)求提交”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“如何防止重復(fù)請(qǐng)求提交”吧!
成都創(chuàng)新互聯(lián)公司主要從事網(wǎng)站設(shè)計(jì)、做網(wǎng)站、網(wǎng)頁(yè)設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)港閘,十載網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專(zhuān)業(yè),歡迎來(lái)電咨詢(xún)建站服務(wù):18980820575
背景
在平常開(kāi)發(fā)中,我們經(jīng)常會(huì)面對(duì)防止重復(fù)請(qǐng)求的問(wèn)題。當(dāng)服務(wù)端對(duì)于請(qǐng)求的響應(yīng)涉及數(shù)據(jù)的修改,或狀態(tài)的變更時(shí),可能會(huì)造成極大的危害。重復(fù)請(qǐng)求的后果在交易系統(tǒng)、售后維權(quán),以及支付系統(tǒng)中尤其嚴(yán)重。但是很多時(shí)候,都是指望著前端來(lái)限制,比如提交之后,按鈕diseabled之類(lèi)的,其實(shí)這些都是不靠譜的。關(guān)鍵時(shí)候還是需要后端來(lái)校驗(yàn)。
解決方式
1、基于緩存數(shù)據(jù)狀態(tài)的驗(yàn)證
redis存儲(chǔ)查詢(xún)輕量快速。在request進(jìn)來(lái)的時(shí)候,可以先記錄在緩存中。后續(xù)進(jìn)來(lái)的request每次進(jìn)行驗(yàn)證。整個(gè)流程處理完成,清除緩存。
if (!CacheExtension.getInstance().AddUnique($"{key}_unique", 1, DateTimeOffset.Now.AddDays(365))) { LogExtention.getInstance().WriteCustomLogAsync("", "", true, "上批次還未執(zhí)行結(jié)束"); return ResponseResult.FromError("上批次還未執(zhí)行結(jié)束!"); }
if (!string.IsNullOrEmpty(uniqueKey)) { CacheExtension.getInstance().Remove(uniqueKey); } return ResponseResult.Ok();
2、利用唯一索引機(jī)制的驗(yàn)證
需要原子性操作,想到了數(shù)據(jù)庫(kù)的唯一索引。新建一個(gè)表,每次request進(jìn)來(lái)則往表里面插入數(shù)據(jù), 操作完成后,刪除此條記錄。
3、基于緩存的計(jì)數(shù)器驗(yàn)證
由于數(shù)據(jù)庫(kù)的操作比較消耗性能,了解到redis的計(jì)數(shù)器也是原子性操作。果斷采用計(jì)數(shù)器。既可以提高性能,還不用存儲(chǔ),而且能提升qps的峰值。 每次request進(jìn)來(lái)則新建一個(gè)以orderId為key的計(jì)數(shù)器,然后+1。如果>1(不能獲得鎖): 說(shuō)明有操作在進(jìn)行,刪除。如果=1(獲得鎖): 可以操作。
redis> SET test 20 OK redis> INCR test (integer) 21 redis> GET test # 數(shù)字值在 Redis 中以字符串的形式保存 "21" //獲取指定的所有計(jì)數(shù)器 HGETALL counter:user:{userID} //獲取指定的指定計(jì)數(shù)器 HMGET counter:user:{userID} praiseCnt hostCnt //指定點(diǎn)贊數(shù)+1 HINCRBY counter:user:{userID} praiseCnt
感謝各位的閱讀,以上就是“如何防止重復(fù)請(qǐng)求提交”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)如何防止重復(fù)請(qǐng)求提交這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!