客戶端的抖動,快速操作,網路通訊或者伺服器響應慢,造成伺服器重複處理。防止重複提交,除了從前端控制,後台也需要控制。因為前端的限制不能解決徹底。介面實現,通常要求冪等性,保證多次重複提交只有一次有效。對於更新操作,達到冪等性很難。
常用後端防止重複提交方案
訪問請求到達伺服器,伺服器端生成token,分別儲存在客戶端和伺服器。提交請求到達伺服器,伺服器端校驗客戶端帶來的token與此時儲存在伺服器的token是否一致,如果一致,就繼續操作,刪除伺服器的token。如果不一致,就不能繼續操作,即這個請求是重複請求。
request進來,沒有就先存在快取中,繼續操作業務,最後刪除快取或者快取設定生命週期。如果存在,就直接對request進行驗證,就不能繼續操作業務。
資料庫中建立唯一索引,記錄每次request請求。新增索引成功,就獲取鎖,繼續操作,最後設定索引失效。新增索引失敗,獲取鎖失敗,不能繼續操作。
redis的計數器是原子操作,不儲存請求,又能提公升qps的峰值。每次request請求,若相同請求,計數器+1,否則新建id為key的計數器。如果》1,不能獲取鎖;如果=1,獲取鎖,操作,最後刪除計數器(刪除鎖)。
提交(post)後執行頁面重定向,成功後轉到提交成功頁面(get),整個流程才算結束。當重新整理頁面,或者瀏覽器前進和後退,都不會引起post請求的重複提交。這裡可以在head中設定control-cache,儲存表單資訊。這個方法依賴前端限制比較多。
分類: 專案例項
客戶端的抖動,快速操作,網路通訊或者伺服器響應慢,造成伺服器重複處理。防止重複提交,除了從前端控制,後台也需要控制。因為前端的限制不能解決徹底。介面實現,通常要求冪等性,保證多次重複提交只有一次有效。對於更新操作,達到冪等性很難。
常用後端防止重複提交方案
訪問請求到達伺服器,伺服器端生成token,分別儲存在客戶端和伺服器。提交請求到達伺服器,伺服器端校驗客戶端帶來的token與此時儲存在伺服器的token是否一致,如果一致,就繼續操作,刪除伺服器的token。如果不一致,就不能繼續操作,即這個請求是重複請求。
request進來,沒有就先存在快取中,繼續操作業務,最後刪除快取或者快取設定生命週期。如果存在,就直接對request進行驗證,就不能繼續操作業務。
資料庫中建立唯一索引,記錄每次request請求。新增索引成功,就獲取鎖,繼續操作,最後設定索引失效。新增索引失敗,獲取鎖失敗,不能繼續操作。
redis的計數器是原子操作,不儲存請求,又能提公升qps的峰值。每次request請求,若相同請求,計數器+1,否則新建id為key的計數器。如果》1,不能獲取鎖;如果=1,獲取鎖,操作,最後刪除計數器(刪除鎖)。
提交(post)後執行頁面重定向,成功後轉到提交成功頁面(get),整個流程才算結束。當重新整理頁面,或者瀏覽器前進和後退,都不會引起post請求的重複提交。這裡可以在head中設定control-cache,儲存表單資訊。這個方法依賴前端限制比較多。
防止重複提交
在jsp頁面的form中,新增 然後在提交的action類中 suppresswarnings unchecked scope prototype controller results parentpackage default interceptorrefs value interceptorre...
防止重複提交
過濾器 repeatable 過濾器 構建可重複讀取inputstream的request submit註解 package com.medaxis.config.interceptor.annotation import j a.lang.annotation.自定義註解防止表單重複提交 inhe...
後端介面防止重複提交 確認收貨防止重複提交
1 在呼叫介面時候肯定會出現ab同事請求介面的問題,當時我在做訂單確認收貨時候就遇到了這種問題,所以我的解決辦法是加上鎖來解決,在這裡我選擇用lock 裡的reentrantlock 在使用者請求方法時候,獲取到使用者id,放入lock,這也同乙個介面如果是2個相同使用者ab同時確認收貨時候,先到先...