PHP实现同一个帐号不允许多人同时重复登陆

原理:

权限验证的时候一定要判断数据库写入session_id是不是和$_session里面的session_id是不是一致,如果不一致就退出,这个防止同一个账户被多个人同时登陆的实现方法就是基于这个session_id
一定要设置session的存活时间,和session关掉页面就session消除
如果有其他人登陆的时候,会写入新的session_id,这样旧的用户就会被权限验证不通过,但是不能做到实时效果,这样就挤掉了旧用户,这里有个缺陷,就是每次验证权限的时候就需要查询数据库,如果可以吧这个数据放在redis就比较好
其实其他的验证方法,也类似使用这种方法,有个验证的凭证,只不过这种方法需要查询数据库,但是放在redis之后就比较好
或者统一管理session的时候,比如放在数据库就更好了,记住吧session_id也存入数据库,或者放在memcash,redis就比较方便,比如在redis进行管理的时候,就可以直接更新掉存在session_id


首先设计表:

1 id int(11) AUTO_INCREMENT
2 username varchar(20) utf8_general_ci
3 password varchar(20) utf8_general_ci 
4 ip varchar(20) utf8_general_ci
5 session_id varchar(100) utf8_general_ci
6 login_time int(20) 


实现:

[php]  view plain  copy
  1. public function aa(){  
  2.   
  3.        session_start();  
  4.         //ini_set('session.auto_start', 0);                    //关闭session自动启动  
  5.         //ini_set('session.cookie_lifetime', 0);//设置session在浏览器关闭时失效  
  6.         //ini_set('session.gc_maxlifetime', 3600);  //session在浏览器未关闭时的持续存活时间  
  7.   
  8.   
  9.        $uname =$_GET['name'];  
  10.        $data['name'] = $uname;  
  11.        $upwd =$_GET['pwd'];  
  12.        $data['pwd'] = $upwd;  
  13.   
  14.        //$data['ip'] = $_SERVER['REMOTE_ADDR'];                   
  15.        //print_r($ipdress);die;  
  16.        //$data['login_time'] = time();//登陆时间更新  
  17.   
  18.        //$data['session_id'] = session_id();  
  19.   
  20.        //$_SESSION['name']=$_GET['name'];  
  21.   
  22.        //$res = M("onlyuser")->add($data);  
  23.        //if($res){  
  24.            //echo "ok";  
  25.        //}else{  
  26.            //echo "false";  
  27.        //}  
  28.   
  29.   
  30.    //开始验证 --防止同一个用户重复登录  
  31. nbsp;$res = M("onlyuser")->where("name = '$uname' AND pwd = '$upwd'")->find();  
  32.   
  33.        if($res){  
  34.                   //    var_dump($s);  
  35.                  //    echo '<br>';  
  36.                 //    echo session_id();  
  37.            if($res['session_id'] === session_id()){  
  38.                //unset($s['session_id']);  
  39.                echo "ok";  
  40.            }  else {  
  41.                $ipdress = $_SERVER['REMOTE_ADDR'];  
  42.                $login_time = time();  
  43.                $session_id = session_id();//重新赋予一个session_id  
  44.                $sql = "update user set ip = '$ipdress',login_time= '$login_time',session_id = '$session_id'";  
  45.                $result1 =mysql_query($sql);  
  46.                // $ss = mysql_fetch_array($result);  
  47.                if($result1){  
  48.                    echo 'OK';  
  49.   
  50.                }  else {  
  51.                    echo 'F';  
  52.                }  
  53.            }  
  54.   
  55.   
  56.   
  57.        }else {  
  58.   
  59.            echo 'FFFFFFFFFFFFFFFFFFFFFFF';  
  60.   
  61.   
  62.        }  
  63.   
  64.    }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值