2.7 登录状态和session
第 14 节 / 共 46 节
课程:ThinkPHP
每次打开首页或者登录成功后,都会有两个请求,它们都返回了404:

其中vcode是验证码,loginfo是检查登录信息,如果未登录,显示“登录、注册”,如果已经登录显示登录信息。
这个请求是哪里来的呢?它来自woniunote.js:
$(document).ready(function(){ $.get('/loginfo', function(data){ content=''; if(data==null){ content+='<a class="nav-item nav-link" href="#" onclick="showLogin()">登录</a>'; content+='<a class="nav-item nav-link" href="#" onclick="showReg()">注册</a>'; } else{ content+='<a class="nav-item nav-link" href="/ucenter">欢迎你:'+data["username"] .split("@")[0]+'</a> '; if(data['role']=='admin'){ content+='<a class="nav-item nav-link" href="/admin">系统管理</a> '; } else{ content+='<a class="nav-item nav-link" href="/ucenter">用户中心</a> '; } content+='<a class="nav-item nav-link" href="/logout">注销</a>'; } $("#loginmenu").append(content); });});这个函数位于woniunote.js的最后,它是一个特殊的函数,功能是:页面加载完成后自动执行一次。而这个函数就发起了/loginfo请求,这个请求很简单,第3行开始到第21行,就是此处理后台返回的信息,data就是从后台返回的数据,逻辑很简单:如果data为空,表示未登录,否则显示登录信息“欢迎你”等等。
那么就需要在后台补充这个/logininfo的请求函数。注意上面的代码第10行使用了data["usename"],以及data['role'],说明/loginfo的处理函数返回的data至少包含username(用户名)和role(角色),但问题来了:登录的信息如何传递过来?
1.session技术
session实际上是一个被所有页面共享的表格,谁都可以存、取里面的数据。那么我们只要在登录成功后把用户信息存入,在loginfo请求里面把它读出,那么就可以实现我们的功能.
首先,登录成功后,把用户相关信息放入session,以下是处理函数login的片段:
$user = new Users(); $user=$user->findByUsername($data['username']); if($data['password']==$user['password']){ //success.html是登录成功后的页面,需要在View/demo文件夹里面新建 //return view('success.html'); //把用户信息存入session session('userid', $user['userid']); session('username', $user['username']); session('nickname', $user['nickname']); session('role', $user['role']); return 'login-pass'; }else{ return 'login-fail'; }然后在loginfo把session里面的用户信息取出来:
public function loginfo() { //从session取出用户信息。。。。 $userId = session('userid'); $username = session('username'); $role = session('role'); $nickname = session('nickname'); if($userId && $username){ return json([ 'username' => $username, 'nickname' => $nickname, 'role' => $role, 'user_id' => $userId, ]); }else{ return json(null); } }取出信息后,检查userId和username是否存在,如果是,那么返回用户信息,否则返回null(未登录)。
2.修改base.htm
登陆后页面没有任何改变,因为loginmenu这个元素不存在,只要找到view/public/base.html的65行,补齐id="loginmenu",并且把66、67、68行的内容删除掉,显示就正常了:

3.注销
其实注销,就是把session里面的用户信息删掉变回未登录状态,如果登录后直接点击注销,会弹出404错误信息:

只需要补上这个处理函数,就可以了:
public function logout(){ session('userid', null); session('username', null); session('nickname', null); session('role', null); return redirect('/'); }最后的redirect是php的跳转函数,可以转到别的页面,例如redirect('/abc'),就相当于访问localhost/abc
《ThinkPHP》课程目录
介绍PHP框架ThinkPHP6
- 第1章 配置环境
- 1.1 第一个ThinkPHP8项目
- 1.2 Composer项目结构介绍
- 1.3 启动项目
- 1.4 ThinkPHP8项目的部署
- 1.5 idea教育版免费一年获取办法
- 第2章 基本特性
- 2.1 响应HTTP请求
- 2.2 响应html
- 2.3 登录-前端
- 2.4 登录-后台
- 2.5 数据库基本操作
- 2.6 模型支持
- 2.7 登录状态和session
- 2.8 注册
- 2.9 主页文章列表
- 2.10 单篇文章内容
- 2.11 完善文章页面
- 2.12 文件上传
- 第3章 实训
- 3.1 项目准备
- 3.2 登录
- 3.3 数据库登录和json规范返回
- 3.4 注册
- 3.5 查询课程
- 3.6 个人信息
- 3.7 修改昵称
- 3.8 *主页信息
- 3.9 统计
- 3.10 学习-侧边导航
- 3.11 *学习-右边内容
- 3.12 管理-课程
- 3.13 管理-班级
- 3.14 管理-班级-学生换班
- 3.15 管理-班级-查找学生
- 第4章 git代码管理
- 4.1 建立代码库
- 4.2 代码管理提交、推送和拉取
- 4.3 从云克隆代码
- 第5章 项目重构成spirngboot
- 5.1 项目技术介绍
- 5.2 创建一个ThinkPHP8项目
- 5.4 移入网页和PHP代码
- 5.5 模型和服务
- 5.7 测试
- 第6章 nginx