用戶在操作表單Post數據時往往會出現表單數據重復提交的問題,尤其在Web開發中此類問題比較常見。刷新頁面,后退操作以前的頁面,單機多次按鈕都會導致數據重復提交。此類問題是因為瀏覽器重復提交HTTP請求導致。
下面列出了四種比較常用的解決方案:
1、在數據庫添加唯一字段
在數據庫建表的時候在ID字段添加主鍵約束,賬號,名稱的信息添加唯一性約束。確保數據庫只可以添加一條數據。
此方法從根本上的防止了數據重復提交。
2、用js為添加按鈕禁用
當用戶提交表單之后,可以使用js將提交按鈕隱藏(disable屬性),防止用戶多次點擊按鈕提交數據。
注意:如果客戶端禁用了js,則此方法無效。
3、使用Post/Redirect/Get
Post/Redirect/Get簡稱PRG,是一種可以防止表單數據重復提交的一種Web設計模式,像用戶刷新提交響應頁面等比較典型的重復提交表單數據的問題可以使用PRG模式來避免。例如:當用戶提交成功之后,執行客戶端重定向,跳轉到提交成功頁面。
注意:PRG設計模式並不適用所有的重復提交情況,比如:
1)由於服務器響應緩慢,用戶刷新提交POST請求造成的重復提交。
2)用戶點擊后退按鈕,返回到數據提交界面,導致的數據重復提交。
3)用戶多次點擊提交按鈕,導致的數據重復提交。
4)用戶惡意避開客戶端預防多次提交手段,進行重復數據提交。
4、使用Session設置令牌
客戶端請求頁面時,服務器為每次產生的Form表單分配唯一的隨機標識號,並且在orm的一個隱藏字段中設置這個標識號,同時在當前用戶的Session中保存這個標識號。當提交表單時,服務器比較hidden和session中的標識號是否相同,相同則繼續,處理完后清空Session,否則服務器忽略請求。
注意:惡意用戶可利用這一性質,不斷重復訪問頁面,以致Session中保存的標識號不斷增多,最終嚴重消耗服務器內存。可以采用在Session中記錄用戶發帖的時間,然后通過一個時間間隔來限制用戶連續發帖的數量來解決這一問題。