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

2015-01-24信息快讯网

防止表单重复提交有很多种方法,其不外乎,客户端脚本防止刷新,服务端token验证等等,thinkphp内置了表单token验证,可以方便的防止表单重复提交

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

用户提交表单以后,点击浏览器后退按钮返回表单页面,这个时候浏览器会直接从缓存中取出页面,因此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 读取Postgresql中的数组
php简单开启gzip压缩方法(zlib.output_compression)
做了CDN获取用户真实IP的函数代码(PHP与Asp设置方式)
php检测图片木马多进制编程实践
php安全开发 添加随机字符串验证,防止伪造跨站请求
PHP表单递交控件名称含有点号(.)会被转化为下划线(_)的处理方法
thinkphp3.0 模板中函数的使用
thinkPHP的Html模板标签使用方法
php中防止恶意刷新页面的代码小结
ThinkPHP3.0略缩图不能保存到子目录的解决方法
ThinkPHP关联模型操作实例分析
Thinkphp模板中使用自定义函数的方法
xml在joomla表单中的应用详解分享
PHP中防止直接访问或查看或下载config.php文件的方法
php后退一页表单内容保存实现方法
php tp验证表单与自动填充函数代码
php代码收集表单内容并写入文件的代码
防止本地用户用fsockopen DDOS攻击对策
PHP中通过语义URL防止网站被攻击的方法分享
php中设置多级目录session的问题
ThinkPHP与PHPExcel冲突解决方法
让Nginx支持ThinkPHP的URL重写和PATHINFO的方法分享
php Smarty初体验二 获取配置信息
php中Smarty模板初体验
PHP 防注入函数(格式化数据)
PHP程序开发范例学习之表单 获取文本框的值
使用ThinkPHP自带的Http类下载远程图片到本地的实现代码
linux下使用ThinkPHP需要注意大小写导致的问题
PHP的一个基础知识 表单提交
php中使用Akismet防止垃圾评论的代码
ThinkPHP自动验证失败的解决方法
php结合表单实现一些简单功能的例子
用PHP的超级变量$_POST获取HTML表单(HTML Form) 数据
用PHP的超级变量$_GET获取HTML表单(Form) 数据
防止用户利用PHP代码DOS造成用光网络带宽
PHP中防止SQL注入实现代码
discuz的php防止sql注入函数
PHP中防止SQL注入攻击和XSS攻击的两个简单方法
©2014-2024 dbsqp.com