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中利用XML技术构造远程服务(下)
Oct 09 PHP
PHP实现的功能是显示8条基色色带
Oct 09 PHP
php基础知识:函数基础知识
Dec 13 PHP
PHP中对用户身份认证实现两种方法
Jun 04 PHP
mongo Table类文件 获取MongoCursor(游标)的实现方法分析
Jul 01 PHP
PHP中使用php5-ffmpeg撷取视频图片实例
Jan 07 PHP
分享十款最出色的PHP安全开发库中文详细介绍
Mar 22 PHP
PHP输出两个数字中间有多少个回文数的方法
Mar 23 PHP
PHP使用缓存即时输出内容(output buffering)的方法
Aug 03 PHP
Yii中创建自己的Widget实例
Jan 05 PHP
超强多功能php绿色集成环境详解
Jan 25 PHP
PHP关于foreach复制知识点总结
Jan 28 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 读取文件的正确方法
2009/04/29 PHP
解决Codeigniter不能上传rar和zip压缩包问题
2014/03/07 PHP
Yii2.0预定义的别名功能小结
2016/07/04 PHP
Yii列表定义与使用分页方法小结(3种方法)
2016/07/15 PHP
PHP删除二维数组中相同元素及数组重复值的方法示例
2017/05/05 PHP
laravel5.1 ajax post 传值_token示例
2019/10/24 PHP
CheckBox 如何实现全选?
2006/06/23 Javascript
Javascript中call与apply的学习笔记
2014/09/22 Javascript
基于jQuery实现的扇形定时器附源码下载
2015/10/20 Javascript
JS数组排序技巧汇总(冒泡、sort、快速、希尔等排序)
2015/11/24 Javascript
微信小程序-详解数据缓存
2016/11/24 Javascript
jQuery获取this当前对象子元素对象的方法
2016/11/29 Javascript
Form表单上传文件(type=&quot;file&quot;)的使用
2017/08/03 Javascript
babel的使用及安装配置教程
2018/02/22 Javascript
[01:35:53]完美世界DOTA2联赛PWL S3 Magma vs GXR 第二场 12.13
2020/12/17 DOTA
python计算书页码的统计数字问题实例
2014/09/26 Python
Python实现根据IP地址和子网掩码算出网段的方法
2015/07/30 Python
python去除空格和换行符的实现方法(推荐)
2017/01/04 Python
pycharm中连接mysql数据库的步骤详解
2017/05/02 Python
基于python3 类的属性、方法、封装、继承实例讲解
2017/09/19 Python
python中set()函数简介及实例解析
2018/01/09 Python
对pandas数据判断是否为NaN值的方法详解
2018/11/06 Python
详解python多线程之间的同步(一)
2019/04/03 Python
详解Python3迁移接口变化采坑记
2019/10/11 Python
Python装饰器使用你可能不知道的几种姿势
2019/10/25 Python
Python高级编程之继承问题详解(super与mro)
2019/11/19 Python
python数据库编程 Mysql实现通讯录
2020/03/27 Python
Scrapy基于scrapy_redis实现分布式爬虫部署的示例
2020/09/29 Python
土耳其国际性时尚购物网站:Modanisa
2018/01/19 全球购物
学校消防安全制度
2014/01/30 职场文书
学校安全工作汇报材料
2014/08/16 职场文书
五五普法心得体会
2014/09/04 职场文书
公司开会通知
2015/04/20 职场文书
幼儿园校车安全责任书
2015/05/08 职场文书
Python OpenCV实现图形检测示例详解
2022/04/08 Python
解决Vmware虚拟机安装centos8报错“Section %Packages Does Not End With %End. Pane Is Dead”
2022/06/01 Servers