php環(huán)境下利用session防止頁(yè)面重復(fù)刷新的具體實(shí)現(xiàn)
更新時(shí)間:2014年01月09日 17:11:50 作者:
如何防止頁(yè)面重復(fù)刷新,在php環(huán)境下可以利用session來(lái)輕松實(shí)現(xiàn),下面是具體的代碼,需要的朋友可以參考下
b.php的代碼
<?php
//只能通過(guò)post方式訪問(wèn)
if ($_SERVER['REQUEST_METHOD'] == 'GET')
{header('HTTP/1.1 404 Not Found'); die('親,頁(yè)面不存在');}
session_start();
$fs1=$_POST['a'];
$fs2=$_POST['b'];
//防刷新時(shí)間,單位為秒
$allowTime = 30;
//讀取訪客ip,以便于針對(duì)ip限制刷新
/*獲取真實(shí)ip開(kāi)始*/
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個(gè)非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;
}
}
/*獲取真實(shí)ip結(jié)束*/
$reip = GetIP();
//相關(guān)參數(shù)md5加密
$allowT = md5($reip.$fs1.$fs2);
if(!isset($_SESSION[$allowT])){
$_SESSION[$allowT] = time();
}
else if(time() - $_SESSION[$allowT]-->$allowTime){
$_SESSION[$allowT] = time();
}
//如果刷新過(guò)快,則直接給出404header頭以及提示
else {header('HTTP/1.1 404 Not Found'); die('來(lái)自'.$ip.'的親,您刷新過(guò)快了');}
?>
代碼很簡(jiǎn)單,無(wú)非是把ip,以及通過(guò)POST方式提交到需要防刷新頁(yè)面的數(shù)據(jù)經(jīng)過(guò)md5加密后寫(xiě)入session中,再通過(guò)存儲(chǔ)的session來(lái)判斷刷新時(shí)間間隔從而決定是否允許刷新。需要說(shuō)明的是"$fs1=$_POST['a'];"、"$fs1=$_POST['a'];"兩個(gè)參數(shù)是指其他頁(yè)面通過(guò)post方式提交到需要防刷新頁(yè)的參數(shù)。之所以除了ip之外還要加這些參數(shù)的原因是為了區(qū)別不同的post結(jié)果。(實(shí)際上所謂的防刷新也就是防止某一頁(yè)面被反復(fù)提交。)
更具體的說(shuō),比如上述代碼放在b.php頁(yè)面的開(kāi)頭,我們?cè)赼.html頁(yè)面有一個(gè)如下表單:
<!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>
可以看到這個(gè)頁(yè)面提交的a和b 2個(gè)參數(shù)正是前面b.php中的2個(gè)參數(shù)(實(shí)際上應(yīng)該反過(guò)來(lái)說(shuō),由提交頁(yè)面的參數(shù)來(lái)決定)。在前面的php代碼中,已經(jīng)確定只能通過(guò)post訪問(wèn)被提交數(shù)據(jù)的頁(yè)面,所以直接輸入地址會(huì)得到一個(gè)404頭的錯(cuò)誤頁(yè)面,只能通過(guò)post方式來(lái)得到頁(yè)面,同時(shí)post刷新的時(shí)候會(huì)自己帶上參數(shù)地址,這樣就實(shí)現(xiàn)了同一頁(yè)面每個(gè)ip的防止刷新效果。
另外我們可以在被post的頁(yè)面增加通過(guò)referer判定來(lái)源網(wǎng)站,防止跨站提交,不過(guò)referer可以偽造,而且firefox和ie8經(jīng)常莫名其妙出現(xiàn)referer丟失的情況,所以暫時(shí)也就不加這個(gè)代碼。
復(fù)制代碼 代碼如下:
<?php
//只能通過(guò)post方式訪問(wèn)
if ($_SERVER['REQUEST_METHOD'] == 'GET')
{header('HTTP/1.1 404 Not Found'); die('親,頁(yè)面不存在');}
session_start();
$fs1=$_POST['a'];
$fs2=$_POST['b'];
//防刷新時(shí)間,單位為秒
$allowTime = 30;
//讀取訪客ip,以便于針對(duì)ip限制刷新
/*獲取真實(shí)ip開(kāi)始*/
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個(gè)非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;
}
}
/*獲取真實(shí)ip結(jié)束*/
$reip = GetIP();
//相關(guān)參數(shù)md5加密
$allowT = md5($reip.$fs1.$fs2);
if(!isset($_SESSION[$allowT])){
$_SESSION[$allowT] = time();
}
else if(time() - $_SESSION[$allowT]-->$allowTime){
$_SESSION[$allowT] = time();
}
//如果刷新過(guò)快,則直接給出404header頭以及提示
else {header('HTTP/1.1 404 Not Found'); die('來(lái)自'.$ip.'的親,您刷新過(guò)快了');}
?>
代碼很簡(jiǎn)單,無(wú)非是把ip,以及通過(guò)POST方式提交到需要防刷新頁(yè)面的數(shù)據(jù)經(jīng)過(guò)md5加密后寫(xiě)入session中,再通過(guò)存儲(chǔ)的session來(lái)判斷刷新時(shí)間間隔從而決定是否允許刷新。需要說(shuō)明的是"$fs1=$_POST['a'];"、"$fs1=$_POST['a'];"兩個(gè)參數(shù)是指其他頁(yè)面通過(guò)post方式提交到需要防刷新頁(yè)的參數(shù)。之所以除了ip之外還要加這些參數(shù)的原因是為了區(qū)別不同的post結(jié)果。(實(shí)際上所謂的防刷新也就是防止某一頁(yè)面被反復(fù)提交。)
更具體的說(shuō),比如上述代碼放在b.php頁(yè)面的開(kāi)頭,我們?cè)赼.html頁(yè)面有一個(gè)如下表單:
復(fù)制代碼 代碼如下:
<!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>
可以看到這個(gè)頁(yè)面提交的a和b 2個(gè)參數(shù)正是前面b.php中的2個(gè)參數(shù)(實(shí)際上應(yīng)該反過(guò)來(lái)說(shuō),由提交頁(yè)面的參數(shù)來(lái)決定)。在前面的php代碼中,已經(jīng)確定只能通過(guò)post訪問(wèn)被提交數(shù)據(jù)的頁(yè)面,所以直接輸入地址會(huì)得到一個(gè)404頭的錯(cuò)誤頁(yè)面,只能通過(guò)post方式來(lái)得到頁(yè)面,同時(shí)post刷新的時(shí)候會(huì)自己帶上參數(shù)地址,這樣就實(shí)現(xiàn)了同一頁(yè)面每個(gè)ip的防止刷新效果。
另外我們可以在被post的頁(yè)面增加通過(guò)referer判定來(lái)源網(wǎng)站,防止跨站提交,不過(guò)referer可以偽造,而且firefox和ie8經(jīng)常莫名其妙出現(xiàn)referer丟失的情況,所以暫時(shí)也就不加這個(gè)代碼。
您可能感興趣的文章:
- android中ListView多次刷新重復(fù)執(zhí)行g(shù)etView的解決方法
- javascript下阻止表單重復(fù)提交、防刷新、防后退
- Asp.Net防止刷新重復(fù)提交數(shù)據(jù)的辦法
- 十分鐘內(nèi)學(xué)會(huì) 避免用戶刷新導(dǎo)致重復(fù)POST提交
- asp.net 處理F5刷新頁(yè)面重復(fù)提交頁(yè)面的一個(gè)思路
- firefox下jquery iframe刷新頁(yè)面提示會(huì)導(dǎo)致重復(fù)之前動(dòng)作
- JSP刷新頁(yè)面表單重復(fù)提交問(wèn)題解決辦法分享
- 關(guān)于頁(yè)面刷新,事件重復(fù)提交的方法分享
- asp.net防止刷新時(shí)重復(fù)提交(可禁用工具條刷新按鈕)
- javaweb用戶注銷后點(diǎn)擊瀏覽器返回刷新頁(yè)面重復(fù)登錄問(wèn)題的解決方法
相關(guān)文章
PHP連接Nginx服務(wù)器并解析Nginx日志的方法
這篇文章主要介紹了PHP連接Nginx服務(wù)器并解析Nginx日志的方法,PHP+Nginx也是目前一種相當(dāng)流行的服務(wù)器搭建方案,需要的朋友可以參考下
2015-08-08
PHP 數(shù)據(jù)庫(kù) 常見(jiàn)問(wèn)題小結(jié)
揭露 PHP 應(yīng)用程序中出現(xiàn)的五個(gè)常見(jiàn)數(shù)據(jù)庫(kù)問(wèn)題 —— 包括數(shù)據(jù)庫(kù)模式設(shè)計(jì)、數(shù)據(jù)庫(kù)訪問(wèn)和使用數(shù)據(jù)庫(kù)的業(yè)務(wù)邏輯代碼 —— 以及它們的解決方案。
2009-06-06
php生成二維碼時(shí)出現(xiàn)中文亂碼的解決方法
這篇文章主要介紹了php生成二維碼時(shí)出現(xiàn)中文亂碼的解決方法,較為詳細(xì)的分析了php生成二維碼的方法,以及出現(xiàn)亂碼時(shí)的解決方法,具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
2014-12-12
完美解決令人抓狂的zend studio 7代碼提示(content Assist)速度慢的問(wèn)題
本篇文章是對(duì)解決令人抓狂的zend studio 7代碼提示(content Assist)速度慢的問(wèn)題進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
2013-06-06
基于magic_quotes_gpc與magic_quotes_runtime的區(qū)別與使用介紹
本篇文章小編為大家介紹,基于magic_quotes_gpc與magic_quotes_runtime的區(qū)別與使用介紹。需要的朋友參考下
2013-04-04
php文件包含目錄配置open_basedir的使用與性能詳解
下面小編就為大家?guī)?lái)一篇php文件包含目錄配置open_basedir的使用與性能詳解。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
2017-04-04
php數(shù)值計(jì)算num類簡(jiǎn)單操作示例
這篇文章主要介紹了php數(shù)值計(jì)算num類簡(jiǎn)單操作,結(jié)合實(shí)例形式分析了PHP數(shù)值計(jì)算相關(guān)函數(shù)與使用技巧,需要的朋友可以參考下
2020-05-05 
