ThinkPHP3.2.2如何实现持久登录功能-创新互联

这篇文章主要介绍ThinkPHP3.2.2如何实现持久登录功能,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

10年积累的成都网站制作、网站建设经验,可以快速应对客户对网站的新想法和需求。提供各种问题对应的解决方案。让选择我们的客户得到更好、更有力的网络服务。我虽然不认识你,你也不认识我。但先网站设计后付款的网站建设流程,更有新乡县免费网站建设让你可以放心的选择与我们合作。

具体如下:

实现持久登录,即用户在登录时,勾选了"记住我"之后,无论是否关闭浏览器,只要不退出登录,在指定的时间内始终保持登录状态(缺点是在另一台电脑上登录过后,之前那台电脑就不能继续保持登录状态)。

首先,持久登陆使用 cookie 实现,但是 cookie 中不能保存用户密码这样重要的信息,即使加密过。解决方案是在用户登录表中新建3个字段identifier:第二身份标识,token:永久登录标识,timeout:永久登录超时时间。

+------------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+----------------+
| uid | int(11) | NO | PRI | NULL | auto_increment |
| uname | varchar(20) | YES | | NULL | |
| upwd | varchar(20) | YES | | NULL | |
| uflag | int(11) | YES | | NULL | |
| identifier | varchar(32) | YES | | NULL | |
| token | varchar(32) | YES | | NULL | |
| timeout | int(11) | YES | | NULL | |
+------------+-------------+------+-----+---------+----------------+

在用户勾选了"记住我"登录时,应该生成一个的 identifier,一个的 token,并且设置一个过期时间 timeout,把两个代表身份的值写入cookie,设置 cookie 过期时间为 timeout,例如:setcookie('auth',"$identifier:$token",$timeout); 同时把三个值插入数据表;当用户再一次访问网站时,首先判断 cookie 中是否含有 auth,如果含有,则去数据库中进行身份比对(identifier 和 token),比对成功时,把用户信息写入 session,同时用户保持登录状态。

代码:

控制器 TestController.class.php

checkLong();
  //已经登录则跳转至个人中心
  if(isset($_SESSION['username'])){
   $this->redirect('Test/ucenter');
  }else{
   //判断是否存在cookie
   if(isset($_COOKIE['username'])){
    $this->assign('username',$_COOKIE['username']);
   }
   //显示注册页
   $this->display("test");
  }
 }
 //显示验证码
 public function verifyImg(){
  $verify = new \Think\Verify();
  //$verify->useZh = true; //使用中文验证码
  $verify->length = 4; 
  $verify->entry();
 }
 //验证登录
 public function check(){
  $verify = new \Think\Verify();
  if($verify->check(I("yzm"))){
   //判断用户名密码
   $user = new \Test\Model\TestModel();
   $res = $user->checkName(I("username"),I("pwd"));
   if($res === false){
    echo "用户名或密码错误";
   }else{
    //用户信息存入session
    session("username",$res['uname']);
    session("id",$res['uid']);
    //如果用户勾选了"记住我",则保持持久登陆
    if(I("remember")){
     $salt = $this->random_str(16);
     //第二分身标识
     $identifier = md5($salt . md5(I("username") . $salt));
     //永久登录标识
     $token = md5(uniqid(rand(), true));
     //永久登录超时时间(1周)
     $timeout = time()+3600*24*7;
     //存入cookie
     setcookie('auth',"$identifier:$token",$timeout);
     $user->saveRemember($res['uid'],$identifier,$token,$timeout);
    }
    //把用户名存入cookie,退出登录后在表单保存用户名信息
    setcookie('username',I('username'),time()+3600*24);
    //跳转至会员中心
    $this->redirect('Test/ucenter');
   }
  }else{
   echo "输入错误";
  }
 } 
 //测试strstr函数
 public function strstrtest(){
  $param = "Think\Verify";
  //第三个参数为true,返回'Think';没有第三个参数,返回'\Verify'
  $name = strstr($param,'\\',true);
  echo $name;
 }
 //用户中心
 public function ucenter(){
  //判断是否永久登录
  $this->checkLong();
  $this->assign("session",$_SESSION);
  $this->display("ucenter");
 }
 //退出登录
 public function loginout(){
  session(null);
  setcookie('auth', '', time()-1);
  $this->redirect("Test/login");
 }
 //生成随机数,用于生成salt
 public function random_str($length){
  //生成一个包含 大写英文字母, 小写英文字母, 数字 的数组
  $arr = array_merge(range(0, 9), range('a', 'z'), range('A', 'Z'));
  $str = '';
  $arr_len = count($arr);
  for ($i = 0; $i < $length; $i++){
   $rand = mt_rand(0, $arr_len-1);
   $str.=$arr[$rand];
  }
  return $str;
 }
 //判断是否持久登录
 public function checkLong(){
  $check = new \Test\Model\TestModel();
  $is_long = $check->checkRemember();
  if($is_long === false){
  }else{
   session("username",$is_long['uname']);
   session("id",$is_long['uid']);
  }
 }
}

模型 TestModel.class.php

getByUname($name);
  if($info != null){
   //验证密码
   if($info['upwd'] == $pwd){
    return $info;
   }else{
    return false;
   }
  }else{
   return false;
  }
 }
 //当用户勾选"记住我"
 public function saveRemember($uid,$identifier,$token,$timeout){
  $admin = M("admin");
  $data['identifier'] = $identifier;
  $data['token'] = $token;
  $data['timeout'] = $timeout;
  $where = " uid = ".$uid;
  $res = $admin->data($data)->where($where)->save();
  return $res;
 }
 //验证用户是否永久登录(记住我)
 public function checkRemember(){
  $arr = array();
  $now = time();
  list($identifier,$token) = explode(':',$_COOKIE['auth']);
  if (ctype_alnum($identifier) && ctype_alnum($token)){
   $arr['identifier'] = $identifier;
   $arr['token'] = $token;
  }else{
   return false;
  }
  $admin = M("admin");
  $info = $admin->getByidentifier($arr['identifier']);
  if($info != null){
   if($arr['token'] != $info['token']){
    return false;
   }else if($now > $info['timeout']){
    return false;
   }else{
    return $info;
   }
  }else{
   return false;
  }
 }
}

视图 登录页 test.html




 
 Document




 
 
 

记住我  

视图 个人中心 ucenter.html




 
 Documenttitle>
</head>
<body>
 <if condition="$session['username'] neq null">
 <i>{$session.username},</i>
 <else />
 <i>游客,</i>
 </if>
 欢迎您<br>
 <a href="__CONTROLLER__/loginout">退出登录</a>
</body>
</html></pre><p><strong>附:模块目录</strong></p><p><img src="/upload/otherpic42/40540.jpg" alt="ThinkPHP3.2.2如何实现持久登录功能"></p><p>以上是“ThinkPHP3.2.2如何实现持久登录功能”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注创新互联行业资讯频道!</p>                    <br>
                    网站题目:ThinkPHP3.2.2如何实现持久登录功能-创新互联                    <br>
                    URL分享:<a href="http://csdahua.cn/article/ecood.html">http://csdahua.cn/article/ecood.html</a>
                </div>
                <div class="view-qrocde cl">
                    <div class="m z"><img src="/Public/Home/images/ew.jpg"/></div>
                    <div class="text">
                        <h6>扫二维码与项目经理沟通</h6>
                        <p>我们在微信上24小时期待你的声音</p>
                        <p>解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流</p>
                    </div>
                </div>
                <div class="othernews cl">
                    <h3>其他资讯</h3>
                    <ul>
                        <li><a href="/article/dchgspe.html">查看java方法代码 java代码</a></li><li><a href="/article/dchgsji.html">怎么开阿里云服务器能便宜 阿里云服务器申请流程</a></li><li><a href="/article/dchgsjj.html">法国域名怎么注册 法国域名怎么注册苹果id</a></li><li><a href="/article/dchgseg.html">帝国CMS支持php 帝国cms支持什么格式</a></li><li><a href="/article/dchgsce.html">java程序将代码转换成 java代码转换器</a></li>                    </ul>
                </div>
            </div>
        </div>
        <div class="sidebar">
            <div class="tuijian">
                <a href="#">
                    <h2 class="cl"><span>行业动态</span></h2>
                    <h3>企业网站建设的重要性!</h3>
                    <p>现在虽然是移动互联网时代,但企业网站依然重要,包含PC站点,移动站。可以说企业网站关系企业的未来发展和前途,尤其对中小企业更是如此,一些中小企业老板,对自己的名片很在乎,因为这是个门面。...</p>
                </a>
            </div>
            <div class="ser sidesub">
                <h2>服务项目</h2>
                <ul class="ebox">
                    <li class="sub sub-1">
                        <div>
                            <h3>网站建设</h3>
                            <p></p>
                            <a class="btn" href="/serve/website/">查看详情</a>
                        </div>
                    </li>
                    <li class="sub sub-1">
                        <div>
                            <h3>移动端/APP</h3>
                            <p></p>
                            <a class="btn" href="/serve/moblie/">查看详情</a>
                        </div>
                    </li>
                    <li class="sub sub-1">
                        <div>
                            <h3>微信/小程序</h3>
                            <p></p>
                            <a class="btn" href="/serve/small/">查看详情</a>
                        </div>
                    </li>
                    <li class="sub sub-1">
                        <div>
                            <h3>技术支持</h3>
                            <p></p>
                            <a class="btn" href="/serve/tech/">查看详情</a>
                        </div>
                    </li>
                    <li class="sub sub-1">
                        <div>
                            <h3>其它服务</h3>
                            <p></p>
                            <a class="btn" href="/serve/othe/">查看详情</a>
                        </div>
                    </li>
                    <li class="sub sub-5">
                        <div>
                            <h3>更多服务项目</h3>
                            <p> <a>用我们的专业和诚信赢得您的信赖,从PC到移动互联网均有您想要的服务!</a></p>
                            <a class="btn" href="/serve/">获取更多</a>
                        </div>
                    </li>
                </ul>
            </div>
            <div class="contact" id="fix">
                <h2 class="cl"> <span>联系吧</span> <a href="https://map.baidu.com/" class="ditu" rel="nofollow" target="_blank">在百度地图上找到我们</a> </h2>
                <h3>电话:13518219792</h3>
                <p>如遇占线或暂未接听请拨:136xxx98888</p>
                <div class="qq"> <a href="//wpa.qq.com/msgrd?v=3&uin=244261566&site=qq&menu=yes" rel="nofollow" target="_blank">业务咨询</a> <a href="//wpa.qq.com/msgrd?v=3&uin=244261566&site=qq&menu=yes" rel="nofollow" target="_blank">技术咨询</a> <a href="//wpa.qq.com/msgrd?v=3&uin=244261566&site=qq&menu=yes" rel="nofollow" target="_blank">售后服务</a> </div>
            </div>
        </div>
        <script>
            //固定滚动
            (function () {
                var oDiv = document.getElementById("fix");
                var H = 120,
                    iE6;
                var Y = oDiv;
                while (Y) {
                    H += Y.offsetTop;
                    Y = Y.offsetParent
                };
                iE6 = window.ActiveXObject && !window.XMLHttpRequest;
                if (!iE6) {
                    window.onscroll = function ()
                    {
                        var s = document.body.scrollTop || document.documentElement.scrollTop;
                        if (s > H) {
                            oDiv.className = "contact  fixed";
                            if (iE6) {
                                oDiv.style.top = (s - H) + "px";
                            }
                        } else {
                            oDiv.className = "contact ";
                        }
                    };
                }

            })();
        </script>
    </div>
    <div class="footer">
        <div class="wp">
            <div class="wpss cl">
                <dl class="about">
                    <dt>网站制作</dt>
                    <dd><a href="http://www.cdxwcx.cn/bj/" target="_blank" title="网站制作报价">网站制作报价</a></dd><dd><a href="http://www.36103.cn/" target="_blank" title="成都网站制作">成都网站制作</a></dd><dd><a href="http://www.cqcxhl.com/" target="_blank" title="网站制作">网站制作</a></dd><dd><a href="http://chengdu.cdxwcx.cn/wangzhan/" target="_blank" title="手机网站制作">手机网站制作</a></dd>                </dl>
                <dl class="about">
                    <dt>网站建设</dt>
                    <dd><a href="http://www.cdweb.net/" target="_blank" title="成都网站建设">成都网站建设</a></dd><dd><a href="https://www.cdxwcx.com/city/ziyang/" target="_blank" title="资阳网站建设">资阳网站建设</a></dd><dd><a href="http://www.cqwzjz.cn/" target="_blank" title="重庆网站建设">重庆网站建设</a></dd><dd><a href="http://www.cdxtjz.cn/" target="_blank" title="成都网站建设">成都网站建设</a></dd>                </dl>
                <dl class="about">
                    <dt>网站设计</dt>
                    <dd><a href="http://chengdu.cdcxhl.cn/dingzhi/" target="_blank" title="定制网站设计">定制网站设计</a></dd><dd><a href="https://www.cdxwcx.com/" target="_blank" title="成都网站设计">成都网站设计</a></dd><dd><a href="http://www.kswcd.cn/serve/" target="_blank" title="专业网站设计">专业网站设计</a></dd><dd><a href="http://www.kswcd.cn/" target="_blank" title="专业网站设计">专业网站设计</a></dd>                </dl>
                <dl class="contact">
                    <dt>联系我们</dt>
                    <dd>电话:13518219792</dd>
                    <dd>邮箱:631063699@qq.com</dd>
                    <dd>地址:成都青羊区锦天国际1002号</dd>
                    <dd>网址:www.csdahua.cn</dd>
                </dl>
                <dl class="flow">
                    <dt></dt>
                    <div class="ma cl">
                        <div class="m"> <img src="/Public/Home/images/ew.jpg" />
                            <p>微信二维码</p>
                        </div>
                    </div>
                </dl>
            </div>
        </div>
        <div class="footer-link wp">
            <ul class="wpss cl">
                <li class="fisrt">友情链接</li>
                            </ul>
        </div>
    </div>
    <div class="bot-footer">
        <div class="wp">
            <p class="wpss"> <em>Copyright © 2002-2023 www.csdahua.cn 快上网建站品牌 QQ:244261566 版权所有</em> <em>备案号:<a href="http://beian.miit.gov.cn/" rel="external nofollow">蜀ICP备19037934号</a></em>
            </p>
            <p class="wpss" style="line-height:30px !important;"> </p>
        </div>
    </div>
    <div class="footer-kefu">
        <ul>
            <li class="qq"><a href="https://wpa.qq.com/msgrd?v=3&uin=244261566&site=qq&menu=yes"><em></em>在线咨询</a>
            </li>
            <li class="tel"><a href="tel:13518219792" target="_blank"><em></em>13518219792</a></li>
            <li class="wx"> <em></em>
                <div class="code"> <img src="/Public/Home/images/ew.jpg" />
                    <p>微信二维码</p>
                </div>
            </li>
            <li class="m"> <em></em>
                <div class="code"> <img src="/Public/Home/images/ew.jpg" />
                    <p>移动版官网</p>
                </div>
            </li>
            <li class="top"><em></em></li>
        </ul>
    </div>
    <script src="/Public/Home/js/all.js"></script>
</body>
</html>
<script>
    $(".cont img").each(function(){
        var src = $(this).attr("src");    //获取图片地址
        var str=new RegExp("http");
        var result=str.test(src);
        if(result==false){
            var url = "https://www.cdcxhl.com"+src;    //绝对路径
            $(this).attr("src",url);
        }
    });
    window.onload=function(){
        document.oncontextmenu=function(){
            return false;
        }
    }
</script>