javaweb防止表單重複提交的幾種解決方案

  • 按鈕倒計時

頁面上表單提交後,將按鈕置灰不可點擊後加入倒計時,比如5秒或者10秒後按鈕恢復點擊狀態才能再次提交。這種方式也可以避免大量請求,減輕服務端訪問的壓力。

  • 驗證碼

頁面上添加驗證碼,不管驗證輸入正確與否,提交後均刷新驗證碼。

  • ajax提交加鎖

採用ajax方式提交表單時,設置一個布爾變量(true/false),當然其他類型變量也可以。初始時為true可以提交,在前端向服務器發出請求後,服務端響應結果沒有回來之前將該值置為false,正常響應時再置為true。

  • 提交後重定向到一個提交成功的頁面

表單提交後跳轉到另外一個成功頁面。這樣可以避免用戶按F5導致的重複提交,瀏覽器也不會出現表單重複提交的警告,以及消除按瀏覽器前進和後退按導致的同樣問題。

  • 服務端生成一個唯一的token

首先在服務端生成一個token保證唯一性,然後將這個token保存在session或者redis等緩存中。與此同時將token放到頁面的隱藏input中,發給瀏覽器。用戶在頁面上提交時帶著這個token一塊提交到服務端,服務端通過比對token的值。如果相等代表首次提交,此時將session或者緩存中保存的token值remove掉,反之則認為重複提交,服務端不予處理。

  • cookie記錄表單提交的狀態

使用Cookie記錄表單提交的狀態,根據其狀態可以檢查是否已經提交過表單。跟上一種類似,服務端生成token存入Cookie,表單提交時將Cookie中token和服務端token比對。

  • 數據庫添加唯一索引約束

向數據庫字段添加一個唯一索引。如果表單重複提交,那麼數據庫插入重複記錄時,唯一約束能有效避免重複入庫。這樣控制的話,日誌會出現Your program attempts to store duplicate values in a database column that is constrained by a unique index的報錯信息,看著有點不爽。

大概也就這些吧,如有大神有更好的解決方法還往不吝賜教。

一般建議這些前後端方法共同結合的雙重機制來保證重複提交的問題。

如果真正重複提交了,後端始終返回同樣結果,也就是保證提交操作的冪等性。

這樣就確保萬無一失啦。

javaweb防止表單重複提交的幾種解決方案


分享到:


相關文章: