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 相关文章推荐
基于文本的留言簿
Oct 09 PHP
解析使用ThinkPHP应该掌握的调试手段
Jun 20 PHP
浅析PHP中Collection 类的设计
Jun 21 PHP
Laravel 5框架学习之Eloquent (laravel 的ORM)
Apr 08 PHP
基于CakePHP实现的简单博客系统实例
Jun 28 PHP
php mysql获取表字段名称和字段信息的三种方法
Nov 13 PHP
PHP实现二维数组去重功能示例
Jan 12 PHP
php简单构造json多维数组的方法示例
Jun 08 PHP
PHP简单实现记录网站访问量功能示例
Jun 06 PHP
PHP判断是否是微信打开还是浏览器打开的方法
Feb 27 PHP
浅析PHP echo 和 print 语句
Jun 30 PHP
php实现统计IP数及在线人数的示例代码
Jul 22 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
要会喝咖啡也要会知道咖啡豆
2021/03/03 咖啡文化
php学习笔记 面向对象的构造与析构方法
2011/06/13 PHP
跟我学Laravel之请求与输入
2014/10/15 PHP
PHP html_entity_decode()函数讲解
2019/02/25 PHP
Laravel 手动开关 Eloquent 修改器的操作方法
2019/12/30 PHP
prototype 1.5 &amp; scriptaculous 1.6.1 学习笔记
2006/09/07 Javascript
你所要知道JS(DHTML)中的一些技巧
2007/01/09 Javascript
textContent在Firefox下与innerText等效的属性
2007/05/12 Javascript
基于jquery的商品展示放大镜
2010/08/07 Javascript
js获取php变量的实现代码
2013/08/10 Javascript
原始的js代码和jquery对比体会
2013/09/10 Javascript
javascript if条件判断方法小结
2014/05/17 Javascript
js操作iframe父子窗体示例
2014/05/22 Javascript
JS实现一个按钮的方法
2015/02/05 Javascript
使用JQuery实现智能表单验证功能
2016/03/08 Javascript
jQuery EasyUI 获取tabs的实例解析
2016/12/06 Javascript
完美解决mui框架off-canvas侧滑超出部分隐藏无法滚动的问题
2018/01/25 Javascript
jQuery实现仿京东防抖动菜单效果示例
2018/07/06 jQuery
深入了解JavaScript 的 WebAssembly
2019/06/15 Javascript
Vue element-ui父组件控制子组件的表单校验操作
2020/07/17 Javascript
解决antd Form 表单校验方法无响应的问题
2020/10/27 Javascript
Vue实现省市区三级联动
2020/12/27 Vue.js
[34:27]DOTA2上海特级锦标赛B组败者赛 VG VS Spirit第一局
2016/02/26 DOTA
零基础写python爬虫之使用Scrapy框架编写爬虫
2014/11/07 Python
Python实现小数转化为百分数的格式化输出方法示例
2017/09/20 Python
解决pyinstaller打包exe文件出现命令窗口一闪而过的问题
2018/10/31 Python
Python图像滤波处理操作示例【基于ImageFilter类】
2019/01/03 Python
python字符串切割:str.split()与re.split()的对比分析
2019/07/16 Python
Python中低维数组填充高维数组的实现
2019/12/02 Python
如何使用Python破解ZIP或RAR压缩文件密码
2020/01/09 Python
Melijoe英国官网:法国儿童时尚网站
2016/11/18 全球购物
应用电子技术专业个人求职信
2013/09/21 职场文书
财务务虚会发言材料
2014/10/20 职场文书
2014年组织委员工作总结
2014/12/01 职场文书
保密法制宣传月活动总结
2015/05/07 职场文书
使用pd.merge表连接出现多余行的问题解决
2022/06/16 Python