后端怎么防止重復提交?(常用的做法)


客戶端的抖動,快速操作,網絡通信或者服務器響應慢,造成服務器重復處理。防止重復提交,除了從前端控制,后台也需要控制。因為前端的限制不能解決徹底。接口實現,通常要求冪等性,保證多次重復提交只有一次有效。對於更新操作,達到冪等性很難。

常用后端防止重復提交方案

  • token

訪問請求到達服務器,服務器端生成token,分別保存在客戶端和服務器。提交請求到達服務器,服務器端校驗客戶端帶來的token與此時保存在服務器的token是否一致,如果一致,就繼續操作,刪除服務器的token。如果不一致,就不能繼續操作,即這個請求是重復請求。

  • 緩存

request進來,沒有就先存在緩存中,繼續操作業務,最后刪除緩存或者緩存設置生命周期。如果存在,就直接對request進行驗證,就不能繼續操作業務。

  • 索引

數據庫中創建唯一索引,記錄每次request請求。添加索引成功,就獲取鎖,繼續操作,最后設置索引失效。添加索引失敗,獲取鎖失敗,不能繼續操作。

  • Redis的計數器

Redis的計數器是原子操作,不存儲請求,又能提升QPS的峰值。每次request請求,若相同請求,計數器+1,否則新建id為key的計數器。如果>1,不能獲取鎖;如果=1,獲取鎖,操作,最后刪除計數器(刪除鎖)。

  • Post/Redirect/Get

提交(Post)后執行頁面重定向,成功后轉到提交成功頁面(Get),整個流程才算結束。當刷新頁面,或者瀏覽器前進和后退,都不會引起Post請求的重復提交。這里可以在head中設置control-cache,保存表單信息。這個方法依賴前端限制比較多。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM