ThinkPHP 防止表單重複提交的方法

2022-04-01 20:19:05 字數 668 閱讀 5094

防止表單重複提交有很多種方法,其不外乎,客戶端指令碼防止重新整理,服務端token驗證等等,thinkphp內建了表單token驗證,可以方便的防止表單重複提交,然而有一種情況,是防止不了的:

使用者提交表單以後,點選瀏覽器後退按鈕返回表單頁面,這個時候瀏覽器會直接從快取中取出頁面,因此token驗證一定是通不過的。

網上有許多種辦法可以繞過這個問題,比如用location.replace()方法來替換當前歷史記錄,但是這樣仍然有瑕疵。極端的情況,若使用者在頁面間切換多次,那麼多點幾次後退按鈕很可能又回到了上乙個表單頁面。

解決辦法是在http頭中設定cache-control: no-cache, no-store。然而我嘗試了無論是在頁面head中新增 還是在action中輸出 header("cache-control: no-cache, no-store") 都無效。

查詢了很久,發現問題出在thinkphp的模板渲染機制上,開啟 thinkphp/lib/think/core/view.class.php 看第173行

header("cache-control: private");//支援頁面回跳

原來tp為了支援頁面回跳,強制在每個模板輸出之前都傳送了乙個cache-control: private的頭,這可真是幫了倒忙了。

把這行注釋掉,刪除tp核心快取,再試一次,發現http響應頭成功改變了

ThinkPHP 防止表單重複提交的方法

thinkphp內建了表單令牌驗證功能,可以有效防止表單的重複提交等安全防護。表單令牌驗證相關的配置引數有 token on true 是否開啟令牌驗證 token name hash 令牌驗證的表單隱藏欄位名稱 token type md5 令牌雜湊驗證規則 預設為md5 token reset ...

Struts2學習10 防止表單的重複提

一 簡介 struts2使用 token 來檢查表單是否重複提交,採用的是同步令牌的方式。同步令牌方式 伺服器端在處理到達的請求之前,會將請求中包含的令牌值與儲存在當前使用者會話中的令牌值進行比較,看是否匹配。在處理完該請求後,且在答 送給客戶端之前,將會產生乙個新的令牌,該令牌除傳給客戶端以外,也...

防止表單重複提交

新增乙個使用者時,發現重複新增了4 5個,原來是重複提交了。怎麼解決這個問題呢,起初是在後端檢查新增的屬性是否已有,例如姓名和手機號是否重複,如果重複就不儲存,沒想到後來隨著業務的複雜化,新增乙個使用者所需時間越來越長,以致在檢查時還沒插入完畢。那就在提交時就關閉form,可是這樣一來,如果後端檢查...