php采用session实现防止页面重复刷新

这篇文章主要介绍了php采用session实现防止页面重复刷新的代码及使用方法,需要的朋友可以参考下,如何防止页面重复刷新,在php环境下可以利用session来轻松实现。

b.php的代码

  1. <?php
  2. //只能通过post方式访问
  3. if ($_SERVER['REQUEST_METHOD'] == 'GET')
  4. {header('HTTP/1.1 404 Not Found'); die('亲,页面不存在');}
  5. session_start();
  6. $fs1=$_POST['a'];
  7. $fs2=$_POST['b'];
  8. //防刷新时间,单位为秒
  9. $allowTime = 30;
  10. //读取访客ip,以便于针对ip限制刷新
  11. /*获取真实ip开始*/
  12. if ( ! function_exists('GetIP'))
  13. {
  14. function GetIP()
  15. {
  16. static $ip = NULL;
  17. if ($ip !== NULL)
  18. {
  19. return $ip;
  20. }
  21. if (isset($_SERVER))
  22. {
  23. if (isset($_SERVER['HTTP_X_FORWARDED_FOR']))
  24. {
  25. $arr = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
  26. /* 取X-Forwarded-For中第x个非unknown的有效IP字符? */
  27. foreach ($arr as $xip)
  28. {
  29. $xip = trim($xip);
  30. if ($xip != 'unknown')
  31. {
  32. $ip = $xip;
  33. break;
  34. }
  35. }
  36. }
  37. elseif (isset($_SERVER['HTTP_CLIENT_IP']))
  38. {
  39. $ip = $_SERVER['HTTP_CLIENT_IP'];
  40. }
  41. else
  42. {
  43. if (isset($_SERVER['REMOTE_ADDR']))
  44. {
  45. $ip = $_SERVER['REMOTE_ADDR'];
  46. }
  47. else
  48. {
  49. $ip = '0.0.0.0';
  50. }
  51. }
  52. }
  53. else
  54. {
  55. if (getenv('HTTP_X_FORWARDED_FOR'))
  56. {
  57. $ip = getenv('HTTP_X_FORWARDED_FOR');
  58. }
  59. elseif (getenv('HTTP_CLIENT_IP'))
  60. {
  61. $ip = getenv('HTTP_CLIENT_IP');
  62. }
  63. else
  64. {
  65. $ip = getenv('REMOTE_ADDR');
  66. }
  67. }
  68. preg_match("/[\d\.]{7,15}/", $ip, $onlineip);
  69. $ip = ! emptyempty($onlineip[0]) ? $onlineip[0] : '0.0.0.0';
  70. return $ip;
  71. }
  72. }
  73. /*获取真实ip结束*/
  74. $reip = GetIP();
  75. //相关参数md5加密
  76. $allowT = md5($reip.$fs1.$fs2);
  77. if(!isset($_SESSION[$allowT])){
  78. $_SESSION[$allowT] = time();
  79. }
  80. else if(time() - $_SESSION[$allowT]-->$allowTime){
  81. $_SESSION[$allowT] = time();
  82. }
  83. //如果刷新过快,则直接给出404header头以及提示
  84. else {header('HTTP/1.1 404 Not Found'); die('来自'.$ip.'的亲,您刷新过快了');}
  85. ?>

代码很简单,无非是把ip,以及通过POST方式提交到需要防刷新页面的数据经过md5加密后写入session中,再通过存储的session来判断刷新时间间隔从而决定是否允许刷新。需要说明的是"$fs1=$_POST['a'];"、"$fs1=$_POST['a'];"两个参数是指其他页面通过post方式提交到需要防刷新页的参数。之所以除了ip之外还要加这些参数的原因是为了区别不同的post结果。(实际上所谓的防刷新也就是防止某一页面被反复提交。)

更具体的说,比如上述代码放在b.php页面的开头,我们在a.html页面有一个如下表单:

代码:

  1. <!DOCTYPE>
  2. <html>
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  5. <title>b.html</title>
  6. </head>
  7. <body>
  8. <form action="b.php" method="post" >
  9. <input type="hidden" name="a" value="a"/>
  10. <input type="hidden" name="b" value="b"/>
  11. <button name="" type="submit" >提交</button>
  12. </form>
  13. </body>
  14. </html>

可以看到这个页面提交的a和b 2个参数正是前面b.php中的2个参数(实际上应该反过来说,由提交页面的参数来决定)。在前面的php代码中,已经确定只能通过post访问被提交数据的页面,所以直接输入地址会得到一个404头的错误页面,只能通过post方式来得到页面,同时post刷新的时候会自己带上参数地址,这样就实现了同一页面每个ip的防止刷新效果。

另外我们可以在被post的页面增加通过referer判定来源网站,防止跨站提交,不过referer可以伪造,而且firefox和ie8经常莫名其妙出现referer丢失的情况,所以暂时也就不加这个代码。