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 相关文章推荐
dede3.1分页文字采集过滤规则详说(图文教程)续二
Apr 03 PHP
PHP file_get_contents 函数超时的几种解决方法
Jul 30 PHP
使用php get_headers 判断URL是否有效的解决办法
Apr 27 PHP
php的ZipArchive类用法实例
Oct 20 PHP
php获取json数据所有的节点路径
May 17 PHP
ThinkPHP框架分布式数据库连接方法详解
Mar 14 PHP
YII2自动登录Cookie总是失效的解决方法
Jun 28 PHP
php注册系统和使用Xajax即时验证用户名是否被占用
Aug 31 PHP
ThinkPHP5.0框架控制器继承基类和自定义类示例
May 25 PHP
PHP基于curl模拟post提交json数据示例
Jun 22 PHP
laravel按天、按小时,查询数据的实例
Oct 09 PHP
TP5框架页面跳转样式操作示例
Apr 05 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
虫族 Zerg 历史背景
2020/03/14 星际争霸
php设计模式 Template (模板模式)
2011/06/26 PHP
2个比较经典的PHP加密解密函数分享
2014/07/01 PHP
PHP MYSQL简易交互式站点开发
2016/12/27 PHP
PHP laravel中的多对多关系实例详解
2017/06/07 PHP
PHP实现的mysql主从数据库状态检测功能示例
2017/07/20 PHP
PHP二维数组实现去除重复项的方法【保留各个键值】
2017/12/21 PHP
jQuery遍历Table应用示例
2014/04/09 Javascript
JavaScript实现的encode64加密算法实例分析
2015/04/15 Javascript
JavaScript获取DOM元素的11种方法总结
2015/04/25 Javascript
jQuery实现简单的列表式导航菜单效果代码
2015/08/31 Javascript
JavaScript实现左侧菜单效果
2017/12/14 Javascript
配置eslint规范项目代码风格
2019/03/11 Javascript
微信小程序简单的canvas裁剪图片功能详解
2019/07/12 Javascript
vue实现点击按钮切换背景颜色的示例代码
2020/06/23 Javascript
小程序自定义弹框效果
2020/11/16 Javascript
[42:32]VP vs RNG 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.21.mp4
2020/07/19 DOTA
浅谈python字符串方法的简单使用
2016/07/18 Python
Python实现全排列的打印
2018/08/18 Python
python打造爬虫代理池过程解析
2019/08/15 Python
python+selenium+Chrome options参数的使用
2020/03/18 Python
python 如何调用远程接口
2020/09/11 Python
python 高阶函数简单介绍
2021/02/19 Python
艺术家策划的室内设计:Curious Egg
2019/03/06 全球购物
android面试问题与答案
2016/12/27 面试题
财务会计专业毕业生自荐信
2013/10/02 职场文书
个人找工作求职简历的自我评价
2013/10/20 职场文书
模范教师事迹材料
2014/02/10 职场文书
《盘古开天地》教学反思
2014/02/28 职场文书
乡镇党的群众路线对照检查材料
2014/09/24 职场文书
假释思想汇报范文
2014/10/11 职场文书
个人作风建设自查报告
2014/10/22 职场文书
单位租车协议书
2015/01/29 职场文书
2015年班长个人工作总结
2015/04/03 职场文书
行政人事专员岗位职责
2015/04/07 职场文书
Golang 对es的操作实例
2022/04/20 Golang