redis - 防止表單重複提交是怎麼做的?
PHP中文网
PHP中文网 2017-04-24 09:10:06
0
2
1305

關於防止表單重複提交的做法有很多,本人知道的有如下,只是簡單講講,大家覺得什麼辦法最簡單又有效?

1.有redis的環境
把提交的動作action,參數之類的作為redis的key,存進redis,設定一個很短的快取時間,提交的時候判斷如果有這個key,表示是重複提交資料。

2.jquery前端判斷
除了在程式端判斷重複提交外,在頁面前端也增加一層措施,如點擊提交按鈕,按鈕狀態不可用(有的按鈕用的a標籤),如果不是按鈕button,可以用jquery在提交的時候設置一個屬性值,如果有了這個屬性值,表示已經提交。

$("body").data("applycancel","unlock");

3.表單隱藏域token

產生一個隨機數,放進session,給表單加一個隱藏域放進token,提交的時候判斷表單的token隱藏域和session的值是否一致,如果不一致表示重複提交,處理表單的時候unset掉這個session。

各位還有什麼辦法,什麼辦法最好,謝謝!

PHP中文网
PHP中文网

认证高级PHP讲师

全部回覆(2)
小葫芦

用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 情況也類似,只需為回傳資源加上一個標識。

伊谢尔伦

把傳過來的參數,產生一個 hash值,存到資料庫的 hash_code 字段,此字段做唯一索引。且每次插資料庫的時候,用同樣的方式產生 hash值,判斷此 hash值是否存在。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板