登录成功后,跳转问题

来源:6-16 登录优化- 控制器业务代码抽离到business层(最新)

China_zr

2020-04-11

登录页登录成功后进入首页,但测试已经登录时候输入登录页跳转测试的时候返回错误
已经登录成功
图片描述
这时候输入login页面的时候,出下面的图中内容.
图片描述

中间件代码

declare(strict_types = 1);
namespace appadminmiddleware;

class Auth
{
    public function handle($request, Closure $next)
    {
        //前置中间件
        if (empty(session(config("admin.session_admin"))) && !preg_match("/login/", $request -> pathinfo()))
        {
            return redirect((string) url('login/index'));
        }
        $response = $next($request);

        return $response;

        //后置中间件


    }

}

Login控制器

namespace appadmincontroller;

use thinkacadeView;
use appcommonmodelmysqlAdminUser as AdminUserModel;

class Login extends AdminBase
{
    public function initialize()
    {
        if ($this -> isLogin())
        {
            return $this -> redirect(url("index/index"));
        }
    }

    public function index()
    {
        return View::fetch();
    }

    //生成MD5加密的用户密码
    public function md5()
    {
        dump(session(config("admin.session_admin")));
        //echo md5("admin_roger");
    }

    //登录页面登录校验
    public function check()
    {
        //首先判断是否为POST请求
        if (!$this -> request -> isPost())
        {
            return show(config("status.error"), "请求验证方式错误");
        }

        //参数验证TP6验证机制
        $username = $this -> request -> param("username", "", "trim");
        $password = $this -> request -> param("password", "", "trim");
        $captcha  = $this -> request -> param("captcha", "", "trim");
        $data = [
            'username'      =>     $username,
            'password'      =>     $password,
            'captcha'       =>     $captcha,
        ];
        $validate = new appadminalidateAdminUser();
        if (!$validate -> check($data))
        {
            return show(config("status.error"), $validate -> getError());
        }

        try {
            $adminUserObj = new appadminusinessAdminUser();
            $result = $adminUserObj -> login($data);
        }  catch (Exception $e)
        {
            return show(config("status.error"), $e -> getMessage());
        }


        if ($result)
        {
            return show(config("status.success"), "登录成功");
        }
        return show(config("status.error"), $validate -> getError());
    }

}

AdminBase

namespace appadmincontroller;

use appBaseController;
use thinkexceptionHttpResponseException;

class AdminBase extends BaseController
{
    public $adminUser = null;
    /**
     * 初始化基础控制器
     */
    public function initialize()
    {
        parent::initialize();
//        // TODO: 判断是否登录,如果用户的session为空,跳转到登陆页
//        if (empty($this -> isLogin()))
//        {
//            return $this -> redirect(url("login/index"), 302);
//        }
    }

    /**
     * 判断用户是否已经登录
     * @return bool
     */
    public function isLogin()
    {
        $this -> adminUser = session(config("admin.session_admin"));
        if (empty($this -> adminUser))
        {
            return false;
        }
        return true;
    }

    /**
     * redirect方法定义
     * @param mixed ...$args
     */
    public function redirect(...$args)
    {
        throw new HttpResponseException(redirect(...$args));
    }


}

个人感觉是session的问题,登录后获取session信息,感觉也不正常,如图
图片描述

AdminUser代码

namespace app\admin\business;

use app\common\model\mysql\AdminUser as AdminUserModel;

class AdminUser
{
    public function __construct()
    {
        $this->adminUserObj = new AdminUserModel();
    }

    public function login($data)
    {
        $adminUser = $this -> getAdminUserByUsername($data['username']);
        if (!$adminUser)
        {
            throw new \think\Exception("输入的用户名不存在");
        }
            //验证密码
            if ($adminUser['password'] != md5($data['password'] . "_roger"))
            {
                throw new \think\Exception("密码输入错误");
            }

            //登录成功后,更新数据库表信息内容
            $updateData = [
                "last_login_time"       =>      time(),
                "last_login_ip"         =>      request() -> ip(),
            ];
            $res = $this -> adminUserObj -> updateById($adminUser['id'], $updateData);
            if (empty($res))
            {
                throw new \think\Exception("登录失败");
            }

        //记录session
        session(config("admin.session_admin"), $adminUser);

        return true;
    }

    public function getAdminUserByUsername($username)
    {
        //验证用户名
        $adminUser = $this -> adminUserObj -> getAdminUserByUsername($username);

        if (empty($adminUser) || $adminUser -> status != config("status.mysql.table_normal"))
        {
            return [];
        }
        $adminUser = $adminUser -> toArray();
        return $adminUser;

    }


}
写回答

2回答

singwa

2020-04-12

代码发出来看看。

0
5
China_zr
回复
singwa
执行写入session,然后打印session的内容就显示图中的问题内容
2020-04-15
共5条回复

慕容4241860

2020-04-11

1.询问问题先贴出代码。2.问题大概率出现在中间件判断登陆之后的跳转 请检查一下代码

0
1
China_zr
已经更新问题代码,您帮忙看一下
2020-04-12
共1条回复

全流程开发 TP6.0实战高并发电商服务系统

一课就能掌握TP6.0基础及运用,打造完整高并发的电商后端项目

1473 学习 · 1334 问题

查看课程