php采用session實(shí)現(xiàn)防止頁面重復(fù)刷新
如何防止頁面重復(fù)刷新,在php環(huán)境下可以利用session來輕松實(shí)現(xiàn)。
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'];
//防刷新時(shí)間,單位為秒
$allowTime = 30;
//讀取訪客ip,以便于針對ip限制刷新
/*獲取真實(shí)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個(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();
}
//如果刷新過快,則直接給出404header頭以及提示
else {header('HTTP/1.1 404 Not Found'); die('來自'.$ip.'的親,您刷新過快了');}
?>
代碼很簡單,無非是把ip,以及通過POST方式提交到需要防刷新頁面的數(shù)據(jù)經(jīng)過md5加密后寫入session中,再通過存儲的session來判斷刷新時(shí)間間隔從而決定是否允許刷新。需要說明的是"$fs1=$_POST['a'];"、"$fs1=$_POST['a'];"兩個(gè)參數(shù)是指其他頁面通過post方式提交到需要防刷新頁的參數(shù)。之所以除了ip之外還要加這些參數(shù)的原因是為了區(qū)別不同的post結(jié)果。(實(shí)際上所謂的防刷新也就是防止某一頁面被反復(fù)提交。)
更具體的說,比如上述代碼放在b.php頁面的開頭,我們在a.html頁面有一個(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è)頁面提交的a和b 2個(gè)參數(shù)正是前面b.php中的2個(gè)參數(shù)(實(shí)際上應(yīng)該反過來說,由提交頁面的參數(shù)來決定)。在前面的php代碼中,已經(jīng)確定只能通過post訪問被提交數(shù)據(jù)的頁面,所以直接輸入地址會得到一個(gè)404頭的錯(cuò)誤頁面,只能通過post方式來得到頁面,同時(shí)post刷新的時(shí)候會自己帶上參數(shù)地址,這樣就實(shí)現(xiàn)了同一頁面每個(gè)ip的防止刷新效果。
另外我們可以在被post的頁面增加通過referer判定來源網(wǎng)站,防止跨站提交,不過referer可以偽造,而且firefox和ie8經(jīng)常莫名其妙出現(xiàn)referer丟失的情況,所以暫時(shí)也就不加這個(gè)代碼。
- asp防止刷新功能實(shí)現(xiàn)代碼
- ASP.Net防止刷新自動觸發(fā)事件的解決方案
- 用Asp如何實(shí)現(xiàn)防止網(wǎng)頁頻繁刷新?
- ASP.Net中防止刷新自動觸發(fā)事件的解決方案
- asp.net防止刷新時(shí)重復(fù)提交(可禁用工具條刷新按鈕)
- Asp.Net防止刷新重復(fù)提交數(shù)據(jù)的辦法
- ASP.NET防止頁面刷新的兩種解決方法小結(jié)
- php環(huán)境下利用session防止頁面重復(fù)刷新的具體實(shí)現(xiàn)
- php防止網(wǎng)站被刷新的方法匯總
- PHP防止刷新重復(fù)提交頁面的示例代碼
- ASP.NET中防止頁面刷新造成表單重復(fù)提交執(zhí)行兩次操作
相關(guān)文章
通過PHP current函數(shù)獲取未知字符鍵名數(shù)組第一個(gè)元素的值
在開發(fā)中經(jīng)常遇到這樣問題,獲取數(shù)組第一個(gè)元素的值,如果是數(shù)字索引那還好,直接$array[0],如果鍵名是字符串,你又未知這個(gè)字符串呢?用current()函數(shù)就可以做到2013-06-06
PHP獲取當(dāng)前文件所在目錄 getcwd()函數(shù)
PHP 當(dāng)前目錄獲取方法。2009-05-05
php使用curl實(shí)現(xiàn)簡單模擬提交表單功能
這篇文章主要為大家詳細(xì)介紹了php使用curl實(shí)現(xiàn)簡單模擬提交表單功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05

