ThinkPHP 防止表单重复提交的方法


Posted in PHP onAugust 08, 2011

然而有一种情况,是防止不了的:

用户提交表单以后,点击浏览器后退按钮返回表单页面,这个时候浏览器会直接从缓存中取出页面,因此token验证一定是通不过的。

网上有许多种办法可以绕过这个问题,比如用location.replace()方法来替换当前历史记录,但是这样仍然有瑕疵。极端的情况,若用户在页面间切换多次,那么多点几次后退按钮很可能又回到了上一个表单页面。

解决办法是在http头中设置Cache-Control: no-cache, no-store。然而我尝试了无论是在页面head中添加 <meta http-equiv="Cache-Control" content="no-cache, no-store"> 还是在Action中输出 header("Cache-control: no-cache, no-store") 都无效。

ThinkPHP 防止表单重复提交的方法

查找了很久,发现问题出在ThinkPHP的模板渲染机制上,打开 ThinkPHP/Lib/Think/Core/View.class.php 看第173行

header("Cache-control: private");  //支持页面回跳

原来TP为了支持页面回跳,强制在每个模板输出之前都发送了一个Cache-control: private的头,这可真是帮了倒忙了。

把这行注释掉,删除TP核心缓存,再试一次,发现HTTP响应头成功改变了

ThinkPHP 防止表单重复提交的方法
PHP 相关文章推荐
php中支持多种编码的中文字符串截取函数!
Mar 20 PHP
PHP 截取字符串 分别适合GB2312和UTF8编码情况
Feb 12 PHP
php程序之die调试法 快速解决错误
Sep 17 PHP
php 生成饼图 三维饼图
Sep 28 PHP
在命令行下运行PHP脚本[带参数]的方法
Jan 22 PHP
一道求$b相对于$a的相对路径的php代码
Aug 08 PHP
thinkphp中连接oracle时封装方法无法用的解决办法
Jun 17 PHP
Laravel框架中实现使用阿里云ACE缓存服务
Feb 10 PHP
PHP连接access数据库
Mar 27 PHP
Yii使用技巧大汇总
Dec 29 PHP
PHP类的自动加载与命名空间用法实例分析
Jun 05 PHP
PHP实现抽奖功能实例代码
Jun 30 PHP
ThinkPHP与PHPExcel冲突解决方法
Aug 08 #PHP
让Nginx支持ThinkPHP的URL重写和PATHINFO的方法分享
Aug 08 #PHP
php Smarty初体验二 获取配置信息
Aug 08 #PHP
php中Smarty模板初体验
Aug 08 #PHP
PHP 防注入函数(格式化数据)
Aug 08 #PHP
PHP中将数组转成XML格式的实现代码
Aug 08 #PHP
PHP程序开发范例学习之表单 获取文本框的值
Aug 08 #PHP
You might like
用php来检测proxy
2006/10/09 PHP
php5.4以上版本GBK编码下htmlspecialchars输出为空问题解决方法汇总
2015/04/03 PHP
作为PHP程序员你要知道的另外一种日志
2018/07/30 PHP
用js重建星际争霸
2006/12/22 Javascript
基于JQuery的密码强度验证代码
2010/03/01 Javascript
Web跨浏览器进程通信(Web跨域)
2013/04/17 Javascript
使用node.js 制作网站前台后台
2014/11/13 Javascript
AngularJS基础 ng-keypress 指令简单示例
2016/08/02 Javascript
js实现hashtable的赋值、取值、遍历操作实例详解
2016/12/25 Javascript
js实现密码强度检验
2017/01/15 Javascript
JavaScript中最常用的10种代码简写技巧总结
2017/06/28 Javascript
Layui组件Table绑定行点击事件和获取行数据的方法
2018/08/19 Javascript
js字符串倒序的实例代码
2018/11/30 Javascript
Jquery动态列功能完整实例
2019/08/30 jQuery
如何将Node.js中的回调转换为Promise
2020/11/10 Javascript
[04:49]2014DOTA2国际邀请赛 Newbee顺利挺进总决赛 ImbaTV独家专访
2014/07/19 DOTA
Python pass 语句使用示例
2014/03/11 Python
Python读取图片EXIF信息类库介绍和使用实例
2014/07/10 Python
使用Python的Zato发送AMQP消息的教程
2015/04/16 Python
Python错误: SyntaxError: Non-ASCII character解决办法
2017/06/08 Python
Python2实现的LED大数字显示效果示例
2017/09/04 Python
Python匿名函数及应用示例
2019/04/09 Python
对python 树状嵌套结构的实现思路详解
2019/08/09 Python
Pytorch在NLP中的简单应用详解
2020/01/08 Python
python实现学生成绩测评系统
2020/06/22 Python
localStorage 设置过期时间的方法实现
2018/12/21 HTML / CSS
3种方式实现瀑布流布局小结
2019/09/05 HTML / CSS
美国标志性加大尺码时装品牌:Ashley Stewart
2016/12/15 全球购物
FLOS美国官网:意大利高级照明工艺的传奇
2018/08/07 全球购物
Javascript如何发送一个Ajax请求
2015/01/26 面试题
专项法律服务方案
2014/06/11 职场文书
全国爱牙日活动总结
2015/02/05 职场文书
2015年医院后勤工作总结
2015/05/20 职场文书
青年志愿者活动感想
2015/08/07 职场文书
React如何创建组件
2021/06/27 Javascript
再谈python_tkinter弹出对话框创建
2022/03/20 Python