例如:多次點擊提現按鈕
?問題描述:
????????在提現操作中,用戶可能會多次點擊提現按鈕,導致多個相同的請求發送到服務器,從而引發重復提現的問題。為了解決這一問題,必須保證每個提現請求只能執行一次,防止重復提交操作。
兩種常見的解決方案:
方案 1:基于瀏覽器頁面打開的時候生成
Token
實現步驟:
生成唯一提現票據(Token)
邏輯:當用戶進入提現頁面時,后端生成一個唯一的
Token
(如UUID
)。該Token
會被存儲到 Redis 中,并設置較短的有效期(如 5 秒)。返回給前端:后端將該
Token
返回給前端,前端每次提交提現請求時,必須攜帶該Token
。校驗
Token
邏輯:每次提現請求時,后端會校驗請求中的
Token
是否存在且未過期。
如果
Token
不存在或已失效,后端直接返回 "重復請求" 錯誤信息,拒絕繼續處理。如果
Token
存在且未過期,后端繼續處理提現請求,并將該Token
從 Redis 中刪除,防止重復提交。適用場景:
適用于防止用戶短時間內多次點擊提現按鈕的場景。
Token
的有效期較短,適用于需要快速防止重復請求的情況。優點:
簡單易實現:只需在后端生成并校驗
Token
,通過短期有效的Token
快速避免重復請求。避免短時間內的重復提交:有效防止用戶因誤操作或延遲導致的多次請求。
缺點:
有效期短:如果用戶在 5 秒(或設置的短期有效期內)沒有再次點擊提現,
Token
會失效,導致無法繼續提交請求。用戶體驗差:若用戶長時間未操作,
Token
會過期,需要重新獲取新的Token
。此時,如果用戶未刷新頁面,可能會導致不必要的操作中斷,影響用戶體驗。假如說,如果遇到下面的問題呢:
用戶在 5 分鐘未點擊操作,或者第一次點擊后 5 分鐘沒有刷新頁面,之后再次點擊會失敗。由于
Token
已過期,系統會認為是重復請求,導致用戶無法繼續提現。
方案 2:基于首次點擊按鈕才生成
Token
?,并存儲于前端實現步驟:
生成并存儲
Token
邏輯:當用戶首次點擊提現按鈕時,后端生成一個唯一的
Token
,并存儲到 Redis 中(例如:5秒)。返回給前端:后端將該
Token
返回給前端,前端將其存儲在瀏覽器(如localStorage
或sessionStorage或者請求頭
)中。后續請求驗證
Token
邏輯:每次用戶點擊提現按鈕時,前端會從瀏覽器緩存中取出
Token
,并將其作為請求的一部分傳遞給后端。后端校驗
Token
:
如果
Token
已存在,說明該請求是重復點擊,拒絕繼續執行,并提示用戶:“您已提交提現請求,請等待處理”。如果
Token
不存在,說明是新的提現請求,后端重新生成并存儲新的Token
,并繼續處理提現請求。適用場景:
適合長時間有效的操作場景,特別是用戶可能在較長時間內未刷新頁面的情況下,系統仍然能夠處理提現請求。
適用于長時間內防止重復提交問題。
優點:
避免
Token
過期問題:用戶在打開瀏覽器頁面后較長時間內可以隨時提交提現請求,而不需要擔心Token
過期。
因為不是打開頁面創建的Token,是首次點擊才創建Token
缺點:
依賴前端存儲:需要依賴前端(如
localStorage
或sessionStorage
)來存儲Token
,如果用戶清除瀏覽器緩存或者使用隱私模式,可能導致Token
丟失。增加系統復雜度:需要保證前后端
Token
的同步,避免出現Token
被濫用的情況。