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 相关文章推荐
生成sessionid和随机密码的例子
Oct 09 PHP
phpmyadmin 常用选项设置详解版
Mar 07 PHP
PHP中运用jQuery的Ajax跨域调用实现代码
Feb 21 PHP
php面向对象 字段的声明与使用
Jun 14 PHP
PHP代码优化之成员变量获取速度对比
Feb 28 PHP
ThinkPHP的cookie和session冲突造成Cookie不能使用的解决方法
Jul 01 PHP
非常全面的php日期时间运算汇总
Nov 04 PHP
YII Framework框架教程之国际化实现方法
Mar 14 PHP
php.ini中date.timezone设置详解
Nov 20 PHP
PHP实现的函数重载功能示例
Aug 03 PHP
php微信公众号开发之翻页查询
Oct 20 PHP
PHP析构函数destruct与垃圾回收机制的讲解
Mar 22 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里的中文变量说明
2011/07/23 PHP
windwos下使用php连接oracle数据库的过程分享
2014/05/26 PHP
js实现DIV的一些简单控制
2007/06/04 Javascript
jQuery的实现原理的模拟代码 -4 重要的扩展函数 extend
2010/08/03 Javascript
用Javascript获取页面元素的具体位置
2013/12/09 Javascript
JS中数组Array的用法示例介绍
2014/02/20 Javascript
不要使用jQuery触发原生事件的方法
2014/03/03 Javascript
JS获取图片lowsrc属性的方法
2015/04/01 Javascript
jQuery+ajax读取并解析XML文件的方法
2016/09/09 Javascript
再谈javascript常见错误及解决方法
2016/09/16 Javascript
JS冒泡事件与事件捕获实例详解
2016/11/25 Javascript
两种简单的跨域方法(jsonp、php)
2017/01/02 Javascript
React Native之ListView实现九宫格效果的示例
2017/08/02 Javascript
在Mac下彻底卸载node和npm的方法
2018/05/16 Javascript
js删除数组中某几项的方法总结
2019/01/16 Javascript
基于Vue实现电商SKU组合算法问题
2019/05/29 Javascript
js之切换全屏和退出全屏实现代码实例
2019/09/09 Javascript
python对象及面向对象技术详解
2016/07/19 Python
Python 爬虫图片简单实现
2017/06/01 Python
python距离测量的方法
2018/03/06 Python
Pandas标记删除重复记录的方法
2018/04/08 Python
Python打包方法Pyinstaller的使用
2018/10/09 Python
python opencv将图片转为灰度图的方法示例
2019/07/31 Python
Python3简单爬虫抓取网页图片代码实例
2019/08/26 Python
Python关于__name__属性的含义和作用详解
2020/02/19 Python
简单了解python调用其他脚本方法实例
2020/03/26 Python
python实现将列表中各个值快速赋值给多个变量
2020/04/02 Python
python构造IP报文实例
2020/05/05 Python
Python实现进度条和时间预估的示例代码
2020/06/02 Python
顺丰快递Java软件工程师面试题
2015/07/31 面试题
升职自荐信
2013/11/28 职场文书
手机被没收检讨书
2014/02/22 职场文书
小学数学教学经验交流材料
2014/05/22 职场文书
2015年教师教学工作总结
2015/04/28 职场文书
深入理解 Golang 的字符串
2022/05/04 Golang
MySQL表字段数量限制及行大小限制详情
2022/07/23 MySQL