关于防止表单重复提交的做法有很多,本人知道的有如下,只是简单讲讲,大家觉得什么办法最简单又有效?
1.有redis的环境
把提交的动作action,参数之类的作为redis的key,存进redis,设置一个很短的缓存时间,提交的时候判断如果存在这个key,说明是重复提交数据。
2.jquery前端判断
除了在程序端判断重复提交外,在页面前端也加一层措施,如点击提交按钮,按钮状态不可用(有的按钮用的a标签),如果不是按钮button,可以用jquery在提交的时候设置一个属性值,如果有了这个属性值,表示已经提交。
$("body").data("applycancel","unlock");
3.表单隐藏域token
生成一个随机数,放进session,给表单加一个隐藏域放进token,提交的时候判断表单的token隐藏域和session的值是否一致,如果不一致表示重复提交,处理表单的时候unset掉这个session。
各位还有什么办法,什么办法最好,谢谢!
高洛峰2017-04-24 09:12:06
用Etag在並發控制中實現樂觀鎖機制,以下例子不僅限於重複提交:
在並發場景中,多個客戶端同時操作同一個資源,會出現一種情況:有客戶端操作的資源在未知情況被發生了變更。
舉個簡單的例子:
用戶A發了一個帖子,內容為post-a
,用户B看到了post-a
之后在下面写评论,在B写评论期间用户A把帖子内容改成了post-aa
。会产生的一个问题是,用户B针对post-a
寫的評論看起來怪怪的^_^
解決辦法很簡單,在B看到A的時候就給他一個帖子資源標識tag-1,B提交評論時連同這個標識tag-1一同提交。伺服器在接受請求之前驗證先驗條件,如果當時貼文內容無任何變化,仍然是tag-1,成功。
如果貼文內容變化,新識別為tag-2,與B提交的tag-1不符合,表示期間資源發生了變化,回傳412 Precondition Failed。然後刷新頁面也好,提示也好,讓B知道這項變更繼續評論。
API 情況也類似,只需為回傳資源加上一個標識。
伊谢尔伦2017-04-24 09:12:06
把傳過來的參數,產生一個 hash值,存到資料庫的 hash_code 字段,此字段做唯一索引。且每次插資料庫的時候,用同樣的方式產生 hash值,判斷此 hash值是否存在。