135-1821-9792

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://www.fjjierui.cn/article/ecood.html">http://www.fjjierui.cn/article/ecood.html</a>
        </div>
    </div>
    <div class="other">
        <h3>其他资讯</h3>
        <ul>
            <li>
                    <a href="/article/piheod.html">CloneORACLE_HOME</a>
                </li><li>
                    <a href="/article/pihspj.html">oracle排序要注意的点</a>
                </li><li>
                    <a href="/article/pihsph.html">oracle体系结构是怎么样的</a>
                </li><li>
                    <a href="/article/pihshe.html">docker如何安装redis5.0.7并挂载外部配置和数据</a>
                </li><li>
                    <a href="/article/pihspd.html">区块链以太坊虚拟机的汇编代码是什么</a>
                </li>        </ul>
    </div>
</div>
<!-- end #bd -->
<div class="c"></div>
<!-- begin #fd -->
<div id="fd" class="index-fd pr">
    <div class="map-bg3"></div>
    <div class="wp">
        <div class="fd-top">
            <dl>
                <dt>关于我们</dt>
                <dd>
                    <ul class="ul-fd">
                        <li><a href="http://www.fjjierui.cn/about#whous">我们是谁</a></li>
                        <li><a href="http://www.fjjierui.cn/about#ourcus">我们服务的客户</a></li>
                        <li><a href="http://www.fjjierui.cn/about#ourteam">我们的团队</a></li>
                    </ul>
                </dd>
            </dl>
            <dl>
                <dt>我们的服务</dt>
                <dd>
                    <ul class="ul-fd">
                        <li><a href="http://www.fjjierui.cn/service#webbuit">网站建设</a></li>
                        <li><a href="http://www.fjjierui.cn/service#weiweb">H5响应式 交互网站</a></li>
                        <li><a href="http://www.fjjierui.cn/service#webmobel">移动端 & 微网站定制</a></li>
                        <li><a href="http://www.fjjierui.cn/service#servweb">服务流程</a></li>
                        <li><a href="http://www.fjjierui.cn/service#solution">行业解决方案</a></li>
                    </ul>
                </dd>
            </dl>
            <dl>
                <dt>网站建设案例</dt>
                <dd>
                    <ul class="ul-fd">

                        <li><a href="http://www.fjjierui.cn/case/">公司集团</a></li>

                        <li><a href="http://www.fjjierui.cn/case/">数码电子科技</a></li>

                        <li><a href="http://www.fjjierui.cn/case/">建筑与设计</a></li>

                        <li><a href="http://www.fjjierui.cn/case/">安防门禁</a></li>

                        <li><a href="http://www.fjjierui.cn/case/">管理咨询美容</a></li>

                        <li><a href="http://www.fjjierui.cn/case/">外贸行业</a></li>

                    </ul>
                </dd>
            </dl>
            <dl>
                <dt>新闻动态</dt>
                <dd>
                    <ul class="ul-fd">

                        <li><a href="/news/2.html">达州网站建设</a></li><li><a href="/news/3.html">达州网站制作</a></li><li><a href="/news/4.html">达州网站设计</a></li>
                    </ul>
                </dd>
            </dl>
            <dl>
                <dt>联系我们</dt>
                <dd class="pr">
                    <p><a href="http://www.fjjierui.cn/news/" class="weixin"></a><a href="http://www.fjjierui.cn/news/" class="sina"></a><span class="weixin-pic"><img src="/Public/Home/pic/ewm.jpg"></span></p>
                    <p><b class="tel">135-1821-9792</b></p>
                    <h5>公司服务热线</h5>
                </dd>
            </dl>
        </div>
        <div class="link">
            友情链接:
            <a href="http://www.txmbzsj.com/" title="led发光广告字" target="_blank">led发光广告字</a>   <a href="http://www.scbrznjsb.com/" title="app开发" target="_blank">app开发</a>   <a href="http://www.scghjhjc.com/" title="广汉锦华建材" target="_blank">广汉锦华建材</a>   <a href="https://www.cdcxhl.com/pinpai.html" title="成都品牌网站建设" target="_blank">成都品牌网站建设</a>   <a href="http://www.jgelj.com/" title="海口施工照明灯" target="_blank">海口施工照明灯</a>   <a href="https://www.cdcxhl.com/hangyead/" title="一元广告" target="_blank">一元广告</a>   <a href="https://www.cdcxhl.com/ruanwen/yingxiao" title="软文发布平台" target="_blank">软文发布平台</a>   <a href="http://www.ytmtp.com/" title="成都木托盘" target="_blank">成都木托盘</a>   <a href="http://www.cdxwcx.cn/tuoguan/" title="成都主机托管" target="_blank">成都主机托管</a>   <a href="http://www.tanhongcy.com/" title="成都食堂托管" target="_blank">成都食堂托管</a>           </div>
    </div>
    <div class="fd-copy">
        <div class="wp">
            <p><span style="color:#CCCCCC;">Copyright © 2009-2022 www.fjjierui.cn 青羊区广皓图文设计工作室(个体工商户)达州站  版权所有</span> <a href="http://beian.miit.gov.cn/" target="_blank" rel="nofollow" style="color:#CCCCCC;">蜀ICP备19037934号</a></p>
        </div>
    </div>
</div>
<div class="side">
    <ul>
        <li><a href="http://wpa.qq.com/msgrd?v=3&uin=631063699&site=qq&menu=yes" target="_blank">
            <div class="sidebox"><img src="/Public/Home/pic/side_icon02.png">在线咨询</div>
        </a></li>
        <li><a href="http://wpa.qq.com/msgrd?v=3&uin=631063699&site=qq&menu=yes" target="_blank">
            <div class="sidebox"><img src="/Public/Home/pic/side_icon01.png">在线咨询</div>
        </a></li>
        <li><a href="tel:135-1821-9792">
            <div class="sidebox"><img src="/Public/Home/pic/side_icon03.png"><span style="font-size:14px">135-1821-9792</span></div>
        </a></li>
    </ul>
</div>
<div class="side2">
    <ul>
        <li><a href="http://www.fjjierui.cn/news/"><img src="/Public/Home/pic/r_icon1.png" alt="达州网站建设"></a>
            <div class="weixin"><em></em><img src="/Public/Home/pic/ewm.jpg" alt="达州网站建设"></div>
        </li>
        <li><a href="javascript:goTop();" class="sidetop"><img src="/Public/Home/pic/r_icon2.png"></a></li>
    </ul>
</div>
<div class="fot">
    <ul>
        <li>
            <a href="https://p.qiao.baidu.com/cps/mobileChat?siteId=11284691&userId=6256368&type=1&reqParam=%20{%22from%22:0,%22sessionid%22:%22%22,%22siteId%22:%2211284691%22,%22tid%22:%22-1%22,%22userId%22:%226256368%22,%22ttype%22:1,%22siteConfig%22:%20{%22eid%22:%226256368%22,%22queuing%22:%22%22,%22siteToken%22:%226ce441ff9e2d6bedbdfc2a4138de449e%22,%22userId%22:%226256368%22,%22isGray%22:%22false%22,%22wsUrl%22:%22wss://p.qiao.baidu.com/cps3/websocket%22,%22likeVersion%22:%22generic%22,%22siteId%22:%2211284691%22,%22online%22:%22true%22,%22webRoot%22:%22//p.qiao.baidu.com/cps3/%22,%22bid%22:%22160142915792139572%22,%22isSmallFlow%22:0,%22isPreonline%22:0,%22invited%22:0%20},%22config%22:%20{%22themeColor%22:%224d74fa%22%20}%20}&appId=&referer=&iswechat=0&expectWaiter=-1&openid=null&otherParam=null&telephone=null&speedLogId=null&eid=null&siteToken=6ce441ff9e2d6bedbdfc2a4138de449e" target="_blank">
                <img src="/Public/Home/pic/fot1.png" alt="">
                <p>在线咨询</p>
            </a>
        </li>
        <li>
            <a href="tel:18980820575" target="_blank">
                <img src="/Public/Home/pic/fot2.png" alt="">
                <p>拨打电话</p>
            </a>
        </li>
    </ul>
</div>
<script type="text/javascript" src="/Public/Home/pic/jquery.js"></script>
<script type="text/javascript" src="/Public/Home/pic/lib.js"></script>
</body></html>
<script>
    $(".con 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>