php环境下利用session防止页面重复刷新的具体实现


Posted in PHP onJanuary 09, 2014

b.php的代码

<?php 
//只能通过post方式访问 
if ($_SERVER['REQUEST_METHOD'] == 'GET') 
{header('HTTP/1.1 404 Not Found'); die('亲,页面不存在');} 
session_start(); 
$fs1=$_POST['a']; 
$fs2=$_POST['b']; 
//防刷新时间,单位为秒 
$allowTime = 30; 
//读取访客ip,以便于针对ip限制刷新 
/*获取真实ip开始*/ 
if ( ! function_exists('GetIP')) 
{ 
function GetIP() 
{ 
static $ip = NULL; 
if ($ip !== NULL) 
{ 
return $ip; 
} 
if (isset($_SERVER)) 
{ 
if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) 
{ 
$arr = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']); 
/* 取X-Forwarded-For中第x个非unknown的有效IP字符? */ 
foreach ($arr as $xip) 
{ 
$xip = trim($xip); 
if ($xip != 'unknown') 
{ 
$ip = $xip; 
break; 
} 
} 
} 
elseif (isset($_SERVER['HTTP_CLIENT_IP'])) 
{ 
$ip = $_SERVER['HTTP_CLIENT_IP']; 
} 
else 
{ 
if (isset($_SERVER['REMOTE_ADDR'])) 
{ 
$ip = $_SERVER['REMOTE_ADDR']; 
} 
else 
{ 
$ip = '0.0.0.0'; 
} 
} 
} 
else 
{ 
if (getenv('HTTP_X_FORWARDED_FOR')) 
{ 
$ip = getenv('HTTP_X_FORWARDED_FOR'); 
} 
elseif (getenv('HTTP_CLIENT_IP')) 
{ 
$ip = getenv('HTTP_CLIENT_IP'); 
} 
else 
{ 
$ip = getenv('REMOTE_ADDR'); 
} 
} 
preg_match("/[\d\.]{7,15}/", $ip, $onlineip); 
$ip = ! empty($onlineip[0]) ? $onlineip[0] : '0.0.0.0'; 
return $ip; 
} 
} 
/*获取真实ip结束*/ 
$reip = GetIP(); 
//相关参数md5加密 
$allowT = md5($reip.$fs1.$fs2); 
if(!isset($_SESSION[$allowT])){ 
$_SESSION[$allowT] = time(); 
} 
else if(time() - $_SESSION[$allowT]-->$allowTime){ 
$_SESSION[$allowT] = time(); 
} 
//如果刷新过快,则直接给出404header头以及提示 
else {header('HTTP/1.1 404 Not Found'); die('来自'.$ip.'的亲,您刷新过快了');} 
?>

代码很简单,无非是把ip,以及通过POST方式提交到需要防刷新页面的数据经过md5加密后写入session中,再通过存储的session来判断刷新时间间隔从而决定是否允许刷新。需要说明的是"$fs1=$_POST['a'];"、"$fs1=$_POST['a'];"两个参数是指其他页面通过post方式提交到需要防刷新页的参数。之所以除了ip之外还要加这些参数的原因是为了区别不同的post结果。(实际上所谓的防刷新也就是防止某一页面被反复提交。)

更具体的说,比如上述代码放在b.php页面的开头,我们在a.html页面有一个如下表单:

<!DOCTYPE> 
<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
<title>b.html</title> 
</head> 
<body> 
<form action="b.php" method="post" > 
<input type="hidden" id="a" name="a" value="a"/> 
<input type="hidden" id="b" name="b" value="b"/> 
<button name="" type="submit" >提交</button> 
</form> 
</body> 
</html>

可以看到这个页面提交的a和b 2个参数正是前面b.php中的2个参数(实际上应该反过来说,由提交页面的参数来决定)。在前面的php代码中,已经确定只能通过post访问被提交数据的页面,所以直接输入地址会得到一个404头的错误页面,只能通过post方式来得到页面,同时post刷新的时候会自己带上参数地址,这样就实现了同一页面每个ip的防止刷新效果。

另外我们可以在被post的页面增加通过referer判定来源网站,防止跨站提交,不过referer可以伪造,而且firefox和ie8经常莫名其妙出现referer丢失的情况,所以暂时也就不加这个代码。

PHP 相关文章推荐
3种平台下安装php4经验点滴
Oct 09 PHP
小偷PHP+Html+缓存
Dec 20 PHP
PHP用mysql数据库存储session的代码
Mar 05 PHP
ThinkPHP中实例Model方法的区别说明
Aug 21 PHP
php开发环境配置记录
Jan 14 PHP
用PHP的超级变量$_GET获取HTML表单(Form) 数据
May 07 PHP
php计算十二星座的函数代码
Aug 21 PHP
php中文乱码怎么办如何让浏览器自动识别utf-8
Jan 15 PHP
PHP中ini_set与ini_get用法实例
Nov 04 PHP
PHP中new static()与new self()的比较
Aug 19 PHP
php版微信公众平台接口开发之智能回复开发教程
Sep 22 PHP
Thinkphp实现站点静态化的方法详解
Mar 21 PHP
浅析php数据类型转换
Jan 09 #PHP
js和php邮箱地址验证的实现方法
Jan 09 #PHP
php检测用户是否用手机(Mobile)访问网站的类
Jan 09 #PHP
php获取文件内容最后一行示例
Jan 09 #PHP
php权重计算方法代码分享
Jan 09 #PHP
php实现分页工具类分享
Jan 09 #PHP
codeigniter框架批量插入数据
Jan 09 #PHP
You might like
基于PHP创建Cookie数组的详解
2013/07/03 PHP
php去除数组中重复数据
2014/11/18 PHP
浅谈PHP eval()函数定义和用法
2016/06/21 PHP
PHP+redis实现微博的拉模型案例详解
2019/07/10 PHP
javascript定时保存表单数据的代码
2011/03/17 Javascript
jWiard 基于JQuery的强大的向导控件介绍
2011/10/28 Javascript
用Javascript实现Windows任务管理器的代码
2012/03/27 Javascript
从数据结构分析看:用for each...in 比 for...in 要快些
2013/04/17 Javascript
JQuery插件开发示例代码
2013/11/06 Javascript
jQuery1.9.1针对checkbox的调整方法(prop)
2014/05/01 Javascript
基于Jquery实现键盘按键监听
2014/05/11 Javascript
JavaScript中最简洁的编码html字符串的方法
2014/10/11 Javascript
什么是 AngularJS?AngularJS简介
2014/12/06 Javascript
jQuery实现仿Google首页拖动效果的方法
2015/05/04 Javascript
JavaScript之Canvas_动力节点Java学院整理
2017/07/04 Javascript
vue单页面打包文件大?首次加载慢?nginx带你飞,从7.5M到1.3M蜕变过程(推荐)
2018/01/16 Javascript
使用vue制作探探滑动堆叠组件的实例代码
2018/03/07 Javascript
Swiper 4.x 使用方法(移动端网站的内容触摸滑动)
2018/05/17 Javascript
解决layui上传文件提示上传异常,实际文件已经上传成功的问题
2018/08/19 Javascript
jQuery利用FormData上传文件实现批量上传
2018/12/04 jQuery
Python程序中的观察者模式结构编写示例
2016/05/27 Python
Python在Matplotlib图中显示中文字体的操作方法
2019/07/29 Python
DJango的创建和使用详解(默认数据库sqlite3)
2019/11/18 Python
Python数据库封装实现代码示例解析
2020/09/05 Python
python合并多个excel文件的示例
2020/09/23 Python
Python3.9.1中使用match方法详解
2021/02/08 Python
html5指南-5.使用web storage存储键值对的数据
2013/01/07 HTML / CSS
一文彻底解决HTML5页面中长按保存图片功能
2019/06/10 HTML / CSS
HEMA法国:荷兰原创设计
2019/02/21 全球购物
自考毕业生自我鉴定
2013/11/04 职场文书
维护民族团结演讲稿
2014/08/27 职场文书
教师个人考察材料
2014/12/16 职场文书
教育实习指导教师评语
2014/12/31 职场文书
工厂员工辞职信范文
2015/05/12 职场文书
党组织结对共建协议书
2016/03/23 职场文书
基于Apache Hudi在Google云构建数据湖平台的思路详解
2022/04/07 Servers