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)
{
$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丢失的情况,所以暂时也就不加这个代码。

(0)

相关推荐

  • ASP.Net中防止刷新自动触发事件的解决方案

    使用asp.net,在刷新页面的时候会自动触发服务器端的事件.举个简单的例子,如:一个注册页面,我们填写完注册信息之后,如果按F5刷新之后,会自动触发到Button事件上,这样就造成了又注册了一次的麻烦. 我先前的解决方案:用关键字查询,如有相同,则提示已有此用户. 但是这种方案不能在没有表识的情况下使用,他会重新提交.鉴于此,我寻找了一种新的解决方案,很庆幸,在朋友的提点下,迸发了这样的解决方案,肯定有更好的解决方案,不吝赐教. 解决思路:刷新时,捕捉KeyPress,让他触发其他无用的事件.

  • ASP.NET防止页面刷新的两种解决方法小结

    方法有二,总结如下: 第一方法: 直接在CS代码里敲: Response.Buffer = true; Response.ExpiresAbsolute = DateTime.Now.AddSeconds(-1); Response.Expires = 0; Response.CacheControl = "no-cache"; 当有人想按后退时页面已过期,效果就达到了 第二方法: SubmitOncePage:解决刷新页面造成的数据重复提交问题(网上资料) 执行过postback操作

  • ASP.NET中防止页面刷新造成表单重复提交执行两次操作

    之前看过别人防刷新的方法,是让页面刷新或返回上一步让页面过期,这里介绍一种另类的方法,使用Session来处理. 实现原理: 由于刷新提交表单,实际上提交的就是上一次正常提交的表单,所以我们只要做一个标志,判断出是新表单还是上一次的旧表单就可以分辨出是否进行了重复提交操作. 实现方法: 在页面上放置一个Hidden域,当页面第一次载入的时候,在Session里面保存一个标志,同时,把这个标志保存到页面上的Hidden里面.在提交表单时,判断表单中提交上来的Hidden和Session中的标志是否

  • asp.net防止刷新时重复提交(可禁用工具条刷新按钮)

    前段时间遇到了需要禁用刷新的需求,f5按钮就不说了,简单的js就能把它禁用,但是工具条上的刷新按钮却傻傻干不掉. 如果简单的在刷新时重新加载画面,通过window.location.href="url"可以很容易的实现,但是需求是要求在刷新时什么都不做,保留画面的状态,这下子可就复杂化了. asp.net中分辨请求是重新请求还是通过刷新按钮再次请求不是很方便,为了实现这个效果,试过了很多的方式,一下面的两种为例 1. 复制代码 代码如下: private bool pageRefres

  • 用Asp如何实现防止网页频繁刷新?

    <%     dim RefreshIntervalTime     RefreshIntervalTime = 3 '防止刷新的时间秒数,0表示不防止     If Not IsEmpty(Session("visit")) and isnumeric(Session("visit")) and int(RefreshIntervalTime) > 0 Then      if (timer()-int(Session("visit"

  • 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开始*/

  • PHP防止刷新重复提交页面的示例代码

    PHP防止刷新重复提交页面的示例代码 作为phper,我们在开发和学习php过程中,难免要经常的接受处理表单数据,然而处理表单的时候总会有一个问题,困扰大家,刷新页面重复提交的问题.如何防止刷新页面重复提交呢? PHP防止刷新重复提交,通过不断刷新(Refresh or Reload)表单提交页面,可以重复提交表单内容,可以利用 PHP 的 Session 来避免这一点,Session 保存在服务器端,在 PHP 过程中改变 Session 变量的值后,即保存在服务器端,下次访问这个变量时,得到

  • php防止网站被刷新的方法汇总

    本文实例讲述了php防止网站被刷新的方法.分享给大家供大家参考.具体方法如下: 对于像采用WP建设的站来说,频繁的刷新会导致数据库吃紧.下面附上一段代码,防止频繁的刷新造成的死机情况. 方法一,代码如下: 复制代码 代码如下: <?php       session_start();       $k=$_GET['k'];       $t=$_GET['t'];       $allowTime = 1800;//防刷新时间       $ip = get_client_ip();     

  • Asp.Net防止刷新重复提交数据的办法

    在网上搜 一下,可以找到很多关于这方面的资料,其中有一篇是来自MSDN上的一种解决方法: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnvs05/html/BedrockASPNET.asp 它是通过重新定义 System.Web.UI.Page 类来实现加载页面时,是"刷新"."后退"请求,还是正常请求,其他的页面则继承了自定义的这 个Page类.感觉他这个方法比较独特,有例子

  • asp防止刷新功能实现代码

    使用说明 1.在要保护的页面顶部加如对AntiRefresh.asp文件的引用如: <!--#include virtual="AntiRefresh.asp" --> 2.接着添加调用代码 复制代码 代码如下: <% Const VarNameDateArr="www_domai_net_App_DataArr" '队列名称 Const VarNameIPArr="www_domai_net_App_IPArr" '队列名称

  • ASP.Net防止刷新自动触发事件的解决方案

    使用asp.net,在刷新页面的时候会自动触发服务器端的事件.举个简单的例子,如:一个注册页面,我们填写完注册信息之后,如果按F5刷新之后,会自动触发到Button事件上,这样就造成了又注册了一次的麻烦. 我先前的解决方案:用关键字查询,如有相同,则提示已有此用户. 但是这种方案不能在没有表识的情况下使用,他会重新提交.鉴于此,我寻找了一种新的解决方案,很庆幸,在朋友的提点下,迸发了这样的解决方案,肯定有更好的解决方案,不吝赐教. 解决思路:刷新时,捕捉KeyPress,让他触发其他无用的事件.

随机推荐