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中在数据库中保存Checkbox数据(2)
Oct 09 PHP
网友原创的PHP模板类代码
Sep 07 PHP
php模拟ping命令(php exec函数的使用方法)
Oct 25 PHP
getJSON跨域SyntaxError问题分析
Aug 07 PHP
laravel安装zend opcache加速器教程
Mar 02 PHP
php入门教程之Zend Studio设置与开发实例
Sep 09 PHP
PHP表单验证内容是否为空的实现代码
Nov 14 PHP
Centos 6.5下PHP 5.3安装ffmpeg扩展的步骤详解
Mar 02 PHP
php下载远程大文件(获取远程文件大小)的实例
Jun 17 PHP
PHP中散列密码的安全性分析
Jul 26 PHP
Laravel5.5 手动分页和自定义分页样式的简单实现
Oct 15 PHP
通过PHP实现获取访问用户IP
May 09 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
下载文件的点击数回填
2006/10/09 PHP
如何使用php判断所处服务器操作系统的类型
2013/06/20 PHP
深入PHP购物车模块功能分析(函数讲解,附源码)
2013/06/25 PHP
PHP file_get_contents设置超时处理方法
2013/09/30 PHP
PHP简单实现生成txt文件到指定目录的方法
2016/04/25 PHP
PHP 搜索查询功能实现
2016/11/29 PHP
js post方式传递提交的实现代码
2010/05/31 Javascript
一步一步制作jquery插件Tabs实现过程
2010/07/06 Javascript
JQuery+CSS提示框实现思路及代码(纯手工打造)
2013/05/07 Javascript
基于jQuery实现的向下滑动二级菜单效果代码
2015/08/31 Javascript
js简单判断移动端系统的方法
2016/02/25 Javascript
解决JS组件bootstrap table分页实现过程中遇到的问题
2016/04/21 Javascript
javascript+html5+css3自定义弹出窗口效果
2017/10/26 Javascript
Vue组件通信入门之Provide和Inject机制
2019/12/29 Javascript
JS面向对象编程——ES6 中class的继承用法详解
2020/03/03 Javascript
[01:45]DOTA2新英雄“神谕者”全方位展示
2014/11/21 DOTA
python连接mysql实例分享
2016/10/09 Python
详解Python if-elif-else知识点
2018/06/11 Python
详解Django中类视图使用装饰器的方式
2018/08/12 Python
python-序列解包(对可迭代元素的快速取值方法)
2019/08/24 Python
linux下python中文乱码解决方案详解
2019/08/28 Python
python3 常见解密加密算法实例分析【base64、MD5等】
2019/12/19 Python
python+pygame实现坦克大战小游戏的示例代码(可以自定义子弹速度)
2020/08/11 Python
CSS3贝塞尔曲线示例:创建链接悬停动画效果
2020/11/19 HTML / CSS
HTML5边玩边学(1)画布实现方法
2010/09/21 HTML / CSS
美国庭院家具购物网站:AlphaMarts
2019/04/10 全球购物
北京RT科技有限公司.net工程师面试题
2013/02/15 面试题
C#笔试题
2015/07/14 面试题
电脑教师的教学自我评价
2013/11/26 职场文书
美术指导求职信
2014/03/17 职场文书
2014年医院个人工作总结
2014/12/09 职场文书
追悼会答谢词
2015/01/05 职场文书
教你漂亮打印Pandas DataFrames和Series
2021/05/29 Python
Spring中bean的生命周期之getSingleton方法
2021/06/30 Java/Android
MySQL系列之九 mysql查询缓存及索引
2021/07/02 MySQL
Centos7中MySQL数据库使用mysqldump进行每日自动备份的编写
2021/08/02 MySQL