原理:
权限验证的时候一定要判断数据库写入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)
实现:
- public function aa(){
- session_start();
- //ini_set('session.auto_start', 0); //关闭session自动启动
- //ini_set('session.cookie_lifetime', 0);//设置session在浏览器关闭时失效
- //ini_set('session.gc_maxlifetime', 3600); //session在浏览器未关闭时的持续存活时间
- $uname =$_GET['name'];
- $data['name'] = $uname;
- $upwd =$_GET['pwd'];
- $data['pwd'] = $upwd;
- //$data['ip'] = $_SERVER['REMOTE_ADDR'];
- //print_r($ipdress);die;
- //$data['login_time'] = time();//登陆时间更新
- //$data['session_id'] = session_id();
- //$_SESSION['name']=$_GET['name'];
- //$res = M("onlyuser")->add($data);
- //if($res){
- //echo "ok";
- //}else{
- //echo "false";
- //}
- //开始验证 --防止同一个用户重复登录
- nbsp;$res = M("onlyuser")->where("name = '$uname' AND pwd = '$upwd'")->find();
- if($res){
- // var_dump($s);
- // echo '<br>';
- // echo session_id();
- if($res['session_id'] === session_id()){
- //unset($s['session_id']);
- echo "ok";
- } else {
- $ipdress = $_SERVER['REMOTE_ADDR'];
- $login_time = time();
- $session_id = session_id();//重新赋予一个session_id
- $sql = "update user set ip = '$ipdress',login_time= '$login_time',session_id = '$session_id'";
- $result1 =mysql_query($sql);
- // $ss = mysql_fetch_array($result);
- if($result1){
- echo 'OK';
- } else {
- echo 'F';
- }
- }
- }else {
- echo 'FFFFFFFFFFFFFFFFFFFFFFF';
- }
- }