V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
madpecker009
V2EX  ›  PHP

thinkphp5 登陆以后 session 就失效了

  •  
  •   madpecker009 · 2020-06-30 20:17:09 +08:00 · 2303 次点击
    这是一个创建于 1395 天前的主题,其中的信息可能已经有所发展或是发生改变。

    描述下情况吧,在登录的时候保存 session (图一),有一个 Base 控制器(图二),除了登录的控制器其余的控制器全部 extends Base 。在 Index 的时候 index()方法 session 还是存在的。在 welcome 方法中就没有了。 现在至少有两个项目出现 这种情况了。真是不知道怎么办了 求大佬们解答。求解释!!! QQ 图片 20200630200908.png QQ 图片 20200630200902.png QQ 图片 20200630200914.png QQ 图片 20200630200917.png

    16 条回复    2020-07-02 08:58:45 +08:00
    RickyC
        1
    RickyC  
       2020-06-30 23:46:19 +08:00
    把 welcome() 里面内容清了, 也变成 return $this->fetch() 呢?
    madpecker009
        2
    madpecker009  
    OP
       2020-07-01 08:32:35 +08:00
    @RickyC 沒有用的 还是会循环这个流程
    zarte
        3
    zarte  
       2020-07-01 09:39:34 +08:00
    看下 index 与 welcome 的 url 是不是同个域
    ben1024
        4
    ben1024  
       2020-07-01 12:32:04 +08:00
    可以排查下有没有 session_start 的操作
    madpecker009
        5
    madpecker009  
    OP
       2020-07-01 13:35:03 +08:00
    @ben1024 确定是开启的 但是就是这样 我也不知道为啥了
    madpecker009
        6
    madpecker009  
    OP
       2020-07-01 13:36:03 +08:00
    @zarte 是的 但是状态码是 302
    维基百科的解释:302 Found,原始描述短语为 Moved Temporarily,是 HTTP 协议中的一个状态码(Status Code)。可以简单的理解为该资源原本确实存在,但已经被临时改变了位置;换而言之,就是请求的资源暂时驻留在不同的 URI 下[1],故而除非特别指定了缓存头部指示,该状态码不可缓存。
    madpecker009
        7
    madpecker009  
    OP
       2020-07-01 13:38:17 +08:00
    @zarte http://a2.learnku.top/manager

    这是测试环境的 你可以 debug 下。谢谢
    qwertyzzz
        8
    qwertyzzz  
       2020-07-01 13:53:32 +08:00
    welcome 整个都删了 重新写个 index1 呢
    madpecker009
        9
    madpecker009  
    OP
       2020-07-01 14:00:11 +08:00
    @qwertyzzz 不可以的。。。之前在我本地就有这个 bug 。后来来了新项目 就没管 第二天自己好了。。线上测试环境的却怎么也不好,。。。
    http://a2.learnku.top/manager/account/login.html
    线上地址
    jfhy0901
        10
    jfhy0901  
       2020-07-01 14:17:30 +08:00
    我试了一下, 显示登陆成功,实际上没有保存登陆状态。检查一下 session 是否开启,检查一下是否保存正常等,包括各种日志等信息,细致排查具体原因。实在没办法请换 JWT 。
    madpecker009
        11
    madpecker009  
    OP
       2020-07-01 14:34:15 +08:00
    @jfhy0901 害 session 确定是开启的,在 index 控制器的 index 方法还是能读取出来 session 的。然后再其他的方法里面就读取不到了。就很让人迷惑。实在不行就像你说的 换 jwt 。
    MorningBOBO
        12
    MorningBOBO  
       2020-07-01 16:01:50 +08:00
    额,文件权限上呢
    casper13
        13
    casper13  
       2020-07-01 16:21:07 +08:00
    贴一下 account/login 代码和 TP5 的完整配置项
    madpecker009
        14
    madpecker009  
    OP
       2020-07-02 08:33:30 +08:00
    ```
    /**
    * 用户登录
    */
    public function login(Request $request)
    {
    // 用户已经登陆直接跳转到首页
    $admin_info = Session::get('admin_info');
    if(!empty($admin_info)){
    $this->redirect('index/index');
    }
    if($request->isAjax())
    {
    $phone = $request->param('phone','','trim,strip_tags,htmlspecialchars');
    $password = $request->param('password','','trim,strip_tags,htmlspecialchars');
    $captcha = $request->param('captcha','','trim,strip_tags,htmlspecialchars');
    if(!captcha_check($captcha)){
    return responseJson('400', '验证码错误');
    }
    $admin_info = \app\manager\model\Admin::alias('a')
    ->join('role r', 'a.role = r.id')
    ->where('phone', $phone)
    ->field('a.*,r.role_name,auth_group')
    ->find();
    if(!$admin_info){
    return responseJson('400','账户信息不存在');
    }
    if($admin_info['is_delete'] || $admin_info['is_freeze']){
    return responseJson('400','账号异常');
    }
    if(!password_verify($password,$admin_info['password'])){
    return responseJson('400','账号密码不匹配');
    }else{
    $data = [
    'login_ip' => get_real_ip(),
    'login_time'=>time()
    ];
    // 更新登录的 ip 地址和登录时间
    $res = Db::name('admin')->where('phone',$phone)->data($data)->update();
    if(!$res){
    return responseJson('500','服务器错误');
    }
    unset($admin_info['password']);
    $admin_info->auth_rule = \app\manager\model\Admin::getUserAuth($admin_info->auth_group);
    Session::set('admin_info',$admin_info);
    return responseJson('200','登陆成功');
    }
    }else{
    return $this->fetch();
    }
    }
    /**
    * 退出登录
    * @param
    * @return
    */
    public function logout()
    {
    Session::delete('admin_info');
    return $this->redirect('account/login');
    }
    ```
    ```
    <?php
    // +----------------------------------------------------------------------
    // | ThinkPHP [ WE CAN DO IT JUST THINK ]
    // +----------------------------------------------------------------------
    // | Copyright (c) 2006~2018 http://thinkphp.cn All rights reserved.
    // +----------------------------------------------------------------------
    // | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
    // +----------------------------------------------------------------------
    // | Author: liu21st <[email protected]>
    // +----------------------------------------------------------------------

    // +----------------------------------------------------------------------
    // | 会话设置
    // +----------------------------------------------------------------------

    return [
    'id' => '',
    // SESSION_ID 的提交变量,解决 flash 上传跨域
    'var_session_id' => '',
    // SESSION 前缀
    'prefix' => 'think',
    // 驱动方式 支持 redis memcache memcached
    'type' => '',
    // 是否自动开启 SESSION
    'auto_start' => true
    ];
    ```
    hbolive
        15
    hbolive  
       2020-07-02 08:52:47 +08:00
    TP5.1,我用的 session 助手函数,没啥问题,要不试试?
    madpecker009
        16
    madpecker009  
    OP
       2020-07-02 08:58:45 +08:00
    @hbolive 我也试过 就是不行 还有一个模块 代码基本都是 copy 的 一点问题都没有
    就是这个 manager 模块出现问题了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   4638 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 10:00 · PVG 18:00 · LAX 03:00 · JFK 06:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.