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