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

首先,持久登陆使用 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

<?php
namespace Test\Controller;
use Think\Controller;class TestController extends Controller {public function login(){//判断是否永久登录$this->checkLong();//已经登录则跳转至个人中心if(isset($_SESSION['username'])){$this->redirect('Test/ucenter');}else{//判断是否存在cookieif(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{//用户信息存入sessionsession("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;//存入cookiesetcookie('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");}//生成随机数,用于生成saltpublic 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

<?php
namespace Test\Model;
use Think\Model;class TestModel extends Model{//验证登录信息public function checkName($name,$pwd){$admin = M("admin");$info = $admin->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

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Document</title>
</head>
<body>
<form action="__CONTROLLER__/check" method="post">
<if condition="$username neq null"><input type="text" name="username" placeholder="用户名" value="{$username}"><br>
<else /><input type="text" name="username" placeholder="用户名"><br>
</if>
<input type="password" name="pwd" placeholder="密码"><br>
<input type="text" name="yzm" placeholder="验证码"><img src="__CONTROLLER__/verifyImg" onClick="this.src=this.src+'?'+Math.random()"><br>
<input type="checkbox" name="remember" id="remember"><label for="remember">记住我</label>
<input type="submit" value="提交">
</form>
</body>
</html>

视图 个人中心 ucenter.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Document</title>
</head>
<body><if condition="$session['username'] neq null"><i>{$session.username},</i><else /><i>游客,</i></if>欢迎您<br><a href="__CONTROLLER__/loginout">退出登录</a>
</body>
</html>

附:模块目录

参考资料:

php持久登录、记住我功能实现:http://blog.csdn.net/clh604/article/details/20282945

php生成包含数字,大小写英文字母的随机字符串:http://www.oschina.net/code/snippet_616695_22223

转载于:https://www.cnblogs.com/dee0912/p/4285221.html

ThinkPHP 3.2.2 实现持久登录 ( 记住我 )相关推荐

  1. ThinkPHP+JQuery实现ajax无刷新登录验证(详解+相关问题)

    ThinkPHP+JQuery实现ajax无刷新登录验证 摘要: 使用原生javascript进行ajax实现无刷新更改页面内容的复杂性尽人皆知,而jquery对ajax传递进行了封装和优化,因此通过 ...

  2. html 记住密码 自动登陆,JavaScript登录记住密码操作(超简单代码)

    废话不多说了,直接给大家贴代码了,具体代码如下所示: 记住密码 记住密码 window.onload = function(){ var oForm = document.getElementById ...

  3. Vue实现登录记住账号密码功能的思路与过程

    文章来源: 学习通http://www.bdgxy.com/ 目录 实现思路 这里有三种方法来存储账号密码: 功能界面 记住账号密码功能的具体实现 密码加密 localStorage cookies ...

  4. android 自动登录机制,Android登录记住密码以及自动登录的实现

    记住密码以及自动登录的实现主要依赖于SharedPreferences类的使用,SharedPreferences是一个轻量级的存储类,用于存储一些小数据,比如登录账号密码以及状态信息等. 本文章只针 ...

  5. Android SharedPreferences登录记住密码

    SharedPreferences是Android中存储简单数据的一个工具类.可以想象它是一个小小的Cookie,它通过用键值对的方式把简单 数据类型(boolean.int.float.long和S ...

  6. Cookie实现用户登录记住密码,实现自动登录

    什么是Cookie 在java是一个类,一对键和值组成,键值都是字符串类型,每个cookie只能保存一对键和值.每个cookie只能保存最大4K的数据 案列应用 保存用户名和密码在浏览器端,Cooki ...

  7. php 登录记住密码,php 记住密码自动登录

    做网站的时候会碰到记住密码,下次自动登录,一周内免登陆,一个月内免登陆这种需求.这种功能一般通过cookie来实现的.用户在登陆的时候,如果选择了记住密码或者一周内免登陆等这个选项的时候,则在用户成功 ...

  8. java用户登录记住密码_java项目中登陆时记住密码

    1.在登陆的时候记住密码,不知自动登陆: 2.登陆页面,填写用户名,密码,点击记住密码,下次进入登陆页面的时候,填写同样的用户名,密码自动填充(在不一次会话的情况下也就是说在不关闭浏览器的情况下): ...

  9. php登陆页添加记住密码选项,PHP 实现登录记住密码

    QQ群:121938294 form页面 用户名 密码 记住密码 用户信息 session_start(); function p($arr){ echo " "; print_r ...

最新文章

  1. SQL Server 数据库崩溃后的恢复之法
  2. Reverse Integer
  3. mysql超经典的8小时问题-wait_timeout
  4. 未能加载文件或程序集Microsoft.VisualStudio.Web.PageInspector.Loader
  5. JS表单学习笔记(思维导图)
  6. postfix只能发邮件,不能接收从其他邮箱发送的邮件 451 4.3.5 Server conf
  7. d3中文案例_D3js初探及数据可视化案例设计实战 -web开发
  8. 一个普通人的震后十年
  9. ubuntu固定内网ip_Ubuntu 设置固定ip地址
  10. 兜兜转转~~,忘不了的break!! 忘不了的continue!!!!
  11. android手机碎片管理,android手机需要进行磁盘碎片整理么
  12. 永川机器人博览会门票_14日 又到永川来看机器人哦
  13. php车牌识别,跨平台车牌识别应用 Light-LPR
  14. 关于人工智能的一些介绍与看法
  15. 会议OA项目(三)---我的会议(会议排座、送审)
  16. Java面试——多线程高并发
  17. 接口(一)什么是接口
  18. 《现代命令行工具指南》9. 删除文件:让删除文件变得安全可控 - trash-cli
  19. EasyRTC视频通话视频会议软件,支持视频会议、会议直播、会议录像的产品
  20. 华为的主动式电子笔M-Pen2

热门文章

  1. java_ant详解
  2. AgileEAS.NET平台开发实例-药店系统-准备开发环境(上)
  3. SQL中 decode()函数简介
  4. SQL Server:日志备份和差异备份还原中的常见问题示例
  5. bzoj 1207: [HNOI2004]打鼹鼠
  6. 洛谷P4609 [FJOI2016]建筑师 【第一类斯特林数】
  7. 中文转换成阿拉伯数字
  8. [转]PCB 设计中敷铜的注意事项
  9. WCF-学习笔记概述之计算服务(1)
  10. Code First 数据库的表中属性的配置