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 相关文章推荐
一个ORACLE分页程序,挺实用的.
Oct 09 PHP
UTF8编码内的繁简转换的PHP类
Jul 09 PHP
php学习之简单计算器实现代码
Jun 09 PHP
php调用方法mssql_fetch_row、mssql_fetch_array、mssql_fetch_assoc和mssql_fetch_objcect读取数据的区别
Aug 08 PHP
php实现memcache缓存示例讲解
Dec 04 PHP
PHP对接微信公众平台消息接口开发流程教程
Mar 25 PHP
ThinkPHP模板范围判断输出In标签与Range标签用法详解
Jun 30 PHP
PHP中使用CURL模拟登录并获取数据实例
Jul 01 PHP
PHP中的替代语法介绍
Jan 09 PHP
php从文件夹随机读取文件的方法
Jun 01 PHP
php+html5实现无刷新图片上传教程
Jan 22 PHP
thinkphp跨库操作的简单代码实例
Sep 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
destoon实现商铺管理主页设置增加新菜单的方法
2014/06/26 PHP
thinkphp中html:list标签传递多个参数实例
2014/10/30 PHP
学习php设计模式 php实现策略模式(strategy)
2015/12/07 PHP
PHP调试的强悍利器之PHPDBG
2016/02/22 PHP
自定义Laravel (monolog)日志位置,并增加请求ID的实现
2019/10/17 PHP
学习jquery之一
2007/04/27 Javascript
JQuery 绑定事件时传递参数的实现方法
2009/10/13 Javascript
javascript forEach通用循环遍历方法
2010/10/11 Javascript
用jquery中插件dialog实现弹框效果实例代码
2013/11/15 Javascript
Javascript 多物体运动的实现
2014/12/24 Javascript
牛叉的Jquery——Jquery与DOM对象的互相转换及DOM的三种操作
2015/10/29 Javascript
jquery  实现轮播图详解及实例代码
2016/10/12 Javascript
谈谈JS中常遇到的浏览器兼容问题和解决方法
2016/12/17 Javascript
JQuery和HTML5 Canvas实现弹幕效果
2017/01/04 Javascript
bootstrap下拉菜单使用方法解析
2017/01/13 Javascript
详解vue事件对象、冒泡、阻止默认行为
2017/03/20 Javascript
讲解vue-router之命名路由和命名视图
2018/05/28 Javascript
JS实现Cookie读、写、删除操作工具类示例
2018/08/28 Javascript
详解小程序中h5页面onShow实现及跨页面通信方案
2019/05/30 Javascript
详解vue之自行实现派发与广播(dispatch与broadcast)
2021/01/19 Vue.js
Anaconda多环境多版本python配置操作方法
2017/09/12 Python
python使用正则表达式的search()函数实现指定位置搜索功能
2017/11/10 Python
Python callable()函数用法实例分析
2018/03/17 Python
Python 普通最小二乘法(OLS)进行多项式拟合的方法
2018/12/29 Python
Python基础之循环语句用法示例【for、while循环】
2019/03/23 Python
详解python websocket获取实时数据的几种常见链接方式
2019/07/01 Python
pandas取出重复数据的方法
2019/07/04 Python
python实现矩阵和array数组之间的转换
2019/11/29 Python
python函数中将变量名转换成字符串实例
2020/05/11 Python
将python字符串转化成长表达式的函数eval实例
2020/05/11 Python
比利时的在线灯具店:Lampen24.be
2019/07/01 全球购物
大学生就业自我鉴定
2013/10/26 职场文书
员工合理化建议书
2014/05/19 职场文书
办公室文员工作自我鉴定
2014/09/19 职场文书
2016年禁毒宣传活动总结
2016/04/05 职场文书
用Python编写简单的gRPC服务的详细过程
2021/07/04 Python