溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

怎么在php中利用session防止頁(yè)面重復(fù)刷新

發(fā)布時(shí)間:2020-12-22 15:13:36 來(lái)源:億速云 閱讀:137 作者:Leah 欄目:開(kāi)發(fā)技術(shù)

這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)?lái)有關(guān)怎么在php中利用session防止頁(yè)面重復(fù)刷新,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

 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è)如下表單:

復(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è)代碼。

上述就是小編為大家分享的怎么在php中利用session防止頁(yè)面重復(fù)刷新了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI