ThinkPHP 防止表單重復(fù)提交的方法
用戶提交表單以后,點(diǎn)擊瀏覽器后退按鈕返回表單頁(yè)面,這個(gè)時(shí)候?yàn)g覽器會(huì)直接從緩存中取出頁(yè)面,因此token驗(yàn)證一定是通不過(guò)的。
網(wǎng)上有許多種辦法可以繞過(guò)這個(gè)問(wèn)題,比如用location.replace()方法來(lái)替換當(dāng)前歷史記錄,但是這樣仍然有瑕疵。極端的情況,若用戶在頁(yè)面間切換多次,那么多點(diǎn)幾次后退按鈕很可能又回到了上一個(gè)表單頁(yè)面。
解決辦法是在http頭中設(shè)置Cache-Control: no-cache, no-store。然而我嘗試了無(wú)論是在頁(yè)面head中添加 <meta http-equiv="Cache-Control" content="no-cache, no-store"> 還是在Action中輸出 header("Cache-control: no-cache, no-store") 都無(wú)效。

查找了很久,發(fā)現(xiàn)問(wèn)題出在ThinkPHP的模板渲染機(jī)制上,打開(kāi) ThinkPHP/Lib/Think/Core/View.class.php 看第173行
header( "Cache-control: private" ); //支持頁(yè)面回跳 |
原來(lái)TP為了支持頁(yè)面回跳,強(qiáng)制在每個(gè)模板輸出之前都發(fā)送了一個(gè)Cache-control: private的頭,這可真是幫了倒忙了。
把這行注釋掉,刪除TP核心緩存,再試一次,發(fā)現(xiàn)HTTP響應(yīng)頭成功改變了

- TP5(thinkPHP5)框架基于ajax與后臺(tái)數(shù)據(jù)交互操作簡(jiǎn)單示例
- thinkPHP5 ajax提交表單操作實(shí)例分析
- thinkPHP5框架實(shí)現(xiàn)基于ajax的分頁(yè)功能示例
- Thinkphp5框架ajax接口實(shí)現(xiàn)方法分析
- ThinkPHP5 通過(guò)ajax插入圖片并實(shí)時(shí)顯示(完整代碼)
- TP5(thinkPHP5)框架使用ajax實(shí)現(xiàn)與后臺(tái)數(shù)據(jù)交互的方法小結(jié)
- ThinkPHP5.1+Ajax實(shí)現(xiàn)的無(wú)刷新分頁(yè)功能示例
- ThinkPHP表單自動(dòng)提交驗(yàn)證實(shí)例教程
- ThinkPHP提交表單時(shí)默認(rèn)自動(dòng)轉(zhuǎn)義的解決方法
- thinkphp3.2實(shí)現(xiàn)在線留言提交驗(yàn)證碼功能
- ThinkPHP防止重復(fù)提交表單的方法實(shí)例分析
- thinkphp5 + ajax 使用formdata提交數(shù)據(jù)(包括文件上傳) 后臺(tái)返回json完整實(shí)例
相關(guān)文章
淺談PHP設(shè)計(jì)模式之對(duì)象池模式Pool
對(duì)象池模式是一種提前準(zhǔn)備了一組已經(jīng)初始化了的對(duì)象『池』而不是按需創(chuàng)建或者銷毀的創(chuàng)建型設(shè)計(jì)模式。對(duì)象池客戶端會(huì)向?qū)ο蟪刂姓?qǐng)求一個(gè)對(duì)象,然后使用這個(gè)返回的對(duì)象執(zhí)行相關(guān)操作。當(dāng)客戶端使用完畢,它將把這個(gè)特定類型的工廠對(duì)象返回給對(duì)象池,而不是銷毀掉這個(gè)對(duì)象。2021-05-05探討file_get_contents與curl效率及穩(wěn)定性的分析
本篇文章是對(duì)file_get_contents與curl效率及穩(wěn)定性進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06PHP結(jié)合jquery ajax實(shí)現(xiàn)上傳多張圖片,并限制圖片大小操作示例
這篇文章主要介紹了PHP結(jié)合jquery ajax實(shí)現(xiàn)上傳多張圖片,并限制圖片大小操作,涉及php結(jié)合jQuery ajax文件上傳及文件屬性相關(guān)操作技巧,需要的朋友可以參考下2019-03-03php實(shí)現(xiàn)基于PDO的預(yù)處理示例
這篇文章主要介紹了php實(shí)現(xiàn)基于PDO的預(yù)處理,結(jié)合實(shí)例形式分析了php實(shí)現(xiàn)pdo預(yù)處理的相關(guān)操作技巧與注意事項(xiàng),需要的朋友可以參考下2017-03-03php中突破基于HTTP_REFERER的防盜鏈措施(stream_context_create)
如果考慮突破防盜鏈的措施,就需要考慮在 HTTP_REFERER 上面做手腳了。很多網(wǎng)站是通過(guò)referer來(lái)判斷是否盜鏈。2011-03-03PHP iconv()函數(shù)字符編碼轉(zhuǎn)換的問(wèn)題講解
今天小編就為大家分享一篇關(guān)于PHP iconv()函數(shù)字符編碼轉(zhuǎn)換的問(wèn)題講解,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-03-03php實(shí)現(xiàn)使用正則將文本中的網(wǎng)址轉(zhuǎn)換成鏈接標(biāo)簽
本文給大家分享一段php中使用正則表達(dá)式將網(wǎng)址轉(zhuǎn)換成A鏈接的函數(shù)代碼,十分簡(jiǎn)潔實(shí)用,這里推薦給大家2014-12-12使用PHP連接多種數(shù)據(jù)庫(kù)的實(shí)現(xiàn)代碼(mysql,access,sqlserver,Oracle)
我們今天為大家介紹的PHP連接數(shù)據(jù)庫(kù)的方法包括在MYSQL數(shù)據(jù)庫(kù)、ACCESS數(shù)據(jù)庫(kù)、MS SQL數(shù)據(jù)庫(kù)和Oracle數(shù)據(jù)庫(kù)中實(shí)現(xiàn)2016-12-12php實(shí)現(xiàn)處理輸入轉(zhuǎn)義字符的代碼
這篇文章主要介紹了php實(shí)現(xiàn)處理輸入轉(zhuǎn)義字符的代碼,需要的朋友可以參考下2015-11-11