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