后端怎么防止重复提交?(常用的做法)
后端怎么防止重復(fù)提交?(常用的做法)
客戶端的抖動(dòng),快速操作,網(wǎng)絡(luò)通信或者服務(wù)器響應(yīng)慢,造成服務(wù)器重復(fù)處理。防止重復(fù)提交,除了從前端控制,后臺(tái)也需要控制。因?yàn)榍岸说南拗撇荒芙鉀Q徹底。接口實(shí)現(xiàn),通常要求冪等性,保證多次重復(fù)提交只有一次有效。對(duì)于更新操作,達(dá)到冪等性很難。
常用后端防止重復(fù)提交方案
- token
訪問請求到達(dá)服務(wù)器,服務(wù)器端生成token,分別保存在客戶端和服務(wù)器。提交請求到達(dá)服務(wù)器,服務(wù)器端校驗(yàn)客戶端帶來的token與此時(shí)保存在服務(wù)器的token是否一致,如果一致,就繼續(xù)操作,刪除服務(wù)器的token。如果不一致,就不能繼續(xù)操作,即這個(gè)請求是重復(fù)請求。
- 緩存
request進(jìn)來,沒有就先存在緩存中,繼續(xù)操作業(yè)務(wù),最后刪除緩存或者緩存設(shè)置生命周期。如果存在,就直接對(duì)request進(jìn)行驗(yàn)證,就不能繼續(xù)操作業(yè)務(wù)。
- 索引
數(shù)據(jù)庫中創(chuàng)建唯一索引,記錄每次request請求。添加索引成功,就獲取鎖,繼續(xù)操作,最后設(shè)置索引失效。添加索引失敗,獲取鎖失敗,不能繼續(xù)操作。
- Redis的計(jì)數(shù)器
Redis的計(jì)數(shù)器是原子操作,不存儲(chǔ)請求,又能提升QPS的峰值。每次request請求,若相同請求,計(jì)數(shù)器+1,否則新建id為key的計(jì)數(shù)器。如果>1,不能獲取鎖;如果=1,獲取鎖,操作,最后刪除計(jì)數(shù)器(刪除鎖)。
- Post/Redirect/Get
提交(Post)后執(zhí)行頁面重定向,成功后轉(zhuǎn)到提交成功頁面(Get),整個(gè)流程才算結(jié)束。當(dāng)刷新頁面,或者瀏覽器前進(jìn)和后退,都不會(huì)引起Post請求的重復(fù)提交。這里可以在head中設(shè)置control-cache,保存表單信息。這個(gè)方法依賴前端限制比較多。
總結(jié)
以上是生活随笔為你收集整理的后端怎么防止重复提交?(常用的做法)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2022-2028年中国轻型客车行业投资
- 下一篇: 2022-2028年中国亲子游行业市场分