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获得文件扩展名三法
Nov 25 PHP
php 随机数的产生、页面跳转、件读写、文件重命名、switch语句
Aug 07 PHP
php 删除记录同时删除图片文件的实现代码
May 12 PHP
PHP禁止页面缓存的代码
Oct 23 PHP
PHP笔记之:基于面向对象设计的详解
May 14 PHP
php获取指定范围内最接近数的方法
Jun 02 PHP
对比分析php中Cookie与Session的异同
Feb 19 PHP
php获取客户端IP及URL的方法示例
Feb 03 PHP
PHP判断json格式是否正确的实现代码
Sep 20 PHP
php常用经典函数集锦【数组、字符串、栈、队列、排序等】
Aug 23 PHP
laravel 解决paginate查询多个字段报错的问题
Oct 22 PHP
PHP数组与字符串互相转换实例
May 05 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/17 PHP
php通过正则表达式记取数据来读取xml的方法
2015/03/09 PHP
[原创]php实现子字符串位置相互对调互换的方法
2016/06/02 PHP
PHP加密技术的简单实现
2016/09/04 PHP
JS option location 页面跳转实现代码
2008/12/27 Javascript
从数组中随机取x条不重复数据的JS代码
2013/12/24 Javascript
js读取被点击次数的简单实例(从数据库中读取)
2014/03/07 Javascript
JSON+HTML实现国家省市联动选择效果
2014/05/18 Javascript
JavaScript显示表单内元素数量的方法
2015/04/02 Javascript
jQuery+ajax实现文章点赞功能的方法
2015/12/31 Javascript
MVC+jQuery.Ajax异步实现增删改查和分页
2020/12/22 Javascript
JS实现匀速与减速缓慢运动的动画效果封装示例
2018/08/27 Javascript
Vue 的 v-model用法实例
2020/11/23 Vue.js
[08:44]DOTA2发布会群星聚首 我们都是刀塔人
2014/03/21 DOTA
python访问纯真IP数据库的代码
2011/05/19 Python
简单的Python2.7编程初学经验总结
2015/04/01 Python
详解Python操作RabbitMQ服务器消息队列的远程结果返回
2016/06/30 Python
在Django同1个页面中的多表单处理详解
2017/01/25 Python
Django 导出 Excel 代码的实例详解
2017/08/11 Python
python opencv 直方图反向投影的方法
2018/02/24 Python
django将图片上传数据库后在前端显式的方法
2018/05/25 Python
如何利用Python模拟GitHub登录详解
2019/07/15 Python
图解python全局变量与局部变量相关知识
2019/11/02 Python
Python接口自动化判断元素原理解析
2020/02/24 Python
python实现小程序推送页面收录脚本
2020/04/20 Python
python打开文件的方式有哪些
2020/06/29 Python
聊聊python中的循环遍历
2020/09/07 Python
image-set实现Retina屏幕下图片显示详细介绍
2012/12/24 HTML / CSS
2019年分享net面试的经历和题目
2016/08/07 面试题
个人批评与自我批评范文
2014/10/17 职场文书
政风行风整改报告
2014/11/06 职场文书
2014年人力资源部工作总结
2014/11/19 职场文书
PostgreSQL13基于流复制搭建后备服务器的方法
2022/01/18 PostgreSQL
简单聊聊Golang中defer预计算参数
2022/03/25 Golang
使用Ajax实现无刷新上传文件
2022/04/12 Javascript
HTML页面点击按钮关闭页面的多种方式
2022/12/24 HTML / CSS