php利用session防止页面重复刷新

如何防止页面重复刷新,在php环境下可以利用session来轻松实现。

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) 
{  www.jbxue.com
$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(); 
} www.jbxue.com
//如果刷新过快,则直接给出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丢失的情况,所以暂时也就不加这个代码。

时间: 2024-10-21 02:21:39

php利用session防止页面重复刷新的相关文章

JAVA–利用Filter和session防止页面重复提交

JAVA–利用Filter和session防止页面重复提交解决思路:1 用户访问表单页面,先经过过滤器,过滤器设置一个随机id作为token令牌, 并将该token放入表单隐藏域中.2 表单响应到浏览器,用户填充数据后提交请求;3 请求经过过滤器,过滤器获取表单中的令牌进行验证,如果和之前生成的令牌一致,则将请求放行,并且清空令牌;4 如果用户重复提交表单,请求经过过滤器,过滤器进行验证.因为第一次放行后令牌已经清空失效,令牌不一致,不放行.跳转到提醒界面. 需用知识:1 过滤器基础知识2 se

新LNMP环境,但是SESSION跨页面或者刷新 session丢失

唠叨:本地WAMP做了一个微信项目,一切OK,昨天需要在LINUX架设一套LNMP环境.但是,在架设代码的时候,登录总是不成功~~~ 最终解决:权限 其实,作为一个程序猿,只要涉及到服务器内容,都应该非常了解权限的问题.但是,如何正确的配置权限,或者那个位置没有配置到权限,才是比较苦恼的.(所有文件夹,给予所有权限的忽略…………) 下面详细说下我的环境部署: 请注明出处,珍惜我们自己的劳动成功~谢谢...http://www.cnblogs.com/Mwsoft/p/4806741.html 1

防止页面重复刷新

1 ClientScript.RegisterStartupScript(ClientScript.GetType(), "myscript", "<script> location.href='List.aspx';</script>");

利用session防止表单重复提交

转自:http://www.cnblogs.com/xdp-gacl/p/3859416.html 利用Session防止表单重复提交 对于[场景二]和[场景三]导致表单重复提交的问题,既然客户端无法解决,那么就在服务器端解决,在服务器端解决就需要用到session了. 具体的做法:在服务器端生成一个唯一的随机标识号,专业术语称为Token(令牌),同时在当前用户的Session域中保存这个Token.然后将Token发送到客户端的Form表单中,在Form表单中使用隐藏域来存储这个Token,

【php】手机版访问手机版页面选择“电脑版”之后不回到原来的手机版页面,利用Session实现

在<[JavaScript]通过JavaScript的方式,如果手机浏览器访问PC版页面,自动跳转到手机版页面>(点击打开链接)中现实了,如果用户通过手机访问你的PC页面,自动跳转到手机版页面,但是,这其中有一个问题,如果那些手机用户看到手机版页面之后,还是需要浏览PC版页面呢?此时,他们点击"电脑版"之后,由于JS的作用,还是回把他们扔回手机版页面. 当然,你可以说是这是用户的事情,让他们的手机浏览器改改浏览标识就是了,但是,我们应该把程序写得更加友好. 此时,可以利用p

asp.net 检测页面是否刷新

 来分析这样一种实际情况,即,在HTTP处理程序处理请求之前对请求进行筛选,这有助于实现一个原本不可能的特征.回发机制有一个严重的缺陷--如果用户刷新当前显示页面,则服务器上所采取的最后一个动作将盲目地重复.例如,如果作为前一次发送的结果添加了一个新记录,则应用程序会在另一次回发时试图插入一个完全相同的记录.当然,这会导致插入完全相同的记录,因而应当产生一个异常.这一缺陷自Web编程最先出现时就已经存在了,ASP.NET无疑不会引入它.要实现非重复的动作,必须采取一些对策,本质上将任何关键的

页面之刷新

HTML 是不是想让页面自动不停刷新,或者自动跳转到另外一个页面? 其实非常简单,只要把以下代码加入页面中就可以了. 1.页面自动刷新:加入<head>区域中 <meta http-equiv="refresh" content="10">,其中10指每隔10秒刷新一次页面. 2.页面自动跳转:加入<head>区域中 <meta http-equiv="refresh" content="10;

Django使用Ajax实现页面无刷新评论回复功能

虽然Django本身自带Form可以提交表单,但在Django中结合Jquery使用Ajax,可以让Django开发的应用发挥更好的用户体验,同时可以降低服务器的负担.普通提交表单方式需要刷新整个页面才可以将评论显示出来,而使用Ajax提交评论之后,可以在页面无刷新的情况下显示出来. 首先是model: class Replay(models.Model): content = models.TextField() post = models.ForeignKey(Post) replay_ti

HTTP与AJAX深入揭秘,不使用AJAX实现页面无刷新

AJAX的原理是什么? 实际上就是发起HTTP请求,既然就是发起HTTP请求,那只要我们能够实现发起HTTP请求就可以在不使用AJAX的情况下实现相同的效果. 在前端有好多方式可以发起HTTP请求,比如script标签的src以及图片的src,css背景图片,等等. 案例1:通过HTTP状态码204实现页面无刷新 下面来一个小案例,实现一个页面无刷新的投票功能. html: <div id="box"> <h1>周杰伦</h1> <p>0