You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Codeigniter控制器无session/cookie时如何传递函数计算值到其他方法

问题根源

你当前调用auth()返回null的直接原因:

  • auth()方法只有当请求携带adminEmail、adminPassword两个POST参数时,才会进入逻辑分支执行return语句;如果调用时没有对应POST参数,最外层的参数校验判断不触发,方法无返回值,自然得到null。
  • 你的需求是同一控制器内跨方法共享生成后的$jwtoken,不需要依赖Session、Cookie即可实现。
解决方案

分两种场景适配:

场景1:同一次HTTP请求内多方法共享

比如addNew方法是在登录验证的同一次请求中调用,直接用控制器类属性存储令牌即可:

  1. 在控制器中声明公共属性用来全局存储JWT令牌
  2. 验证通过后将令牌赋值给类属性,所有方法直接访问该属性即可获取值

改造后的示例代码:

<?php
class Employees extends CI_Controller
{
    // 声明全局存储jwt的类属性
    public $jwtoken = '';

    public function __construct()
    {
        parent::__construct();
    }

    public function auth() {
        $adminEmail = $this->input->post('adminEmail');
        $adminPassword =  $this->input->post('adminPassword');
        if ($adminEmail != "" && $adminPassword != "") {
            // 提示:这里改用查询绑定避免SQL注入风险
            $query = $this->db->query("select * from admin_tbl where email= ? and password = ?", [$adminEmail, $adminPassword]);
            if ($query->num_rows() <= 0) {
                $response = array();
                $this->jwtoken = "";
                $this->session->set_flashdata("invalid", "Wrong email or password"); 
                $response = array(
                    'status' => 'invalid',
                    'message' => $this->session->flashdata("invalid"),
                    'token' => $this->jwtoken,
                );
                $this->output
                    ->set_content_type('application/json')
                    ->set_output(json_encode($response));
                return $this->jwtoken;
            } else {   
                $response = array();
                $jwt = new JWT();
                $data = array(
                    'adminEmail' => $adminEmail,
                    'iat' => time()
                );
                // 生成jwt后赋值给类属性
                $this->jwtoken = $jwt->encode($data, jwtSecretKey, 'HS256');
                $this->session->set_flashdata("login", "Successfully login!");
                if ($this->jwtoken != "") {
                    $response = array(
                        'status' => 'valid',
                        'message' => $this->session->flashdata("login"),
                        'token' => $this->jwtoken
                    );
                }
                $this->output
                    ->set_content_type('application/json')
                    ->set_output(json_encode($response));
                return $this->jwtoken;
            } 
        }
        // 无POST参数时直接返回已存储的token
        return $this->jwtoken;
    }

    public function addNew()
    {
        $response = array();
        // 直接获取令牌即可,也可以直接访问$this->jwtoken
        $token = $this->auth();
        var_dump($token);
    }
}
?>

场景2:跨HTTP请求共享(登录后访问其他接口)

JWT的原生设计就是不依赖服务端会话,你只需要要求客户端登录成功后把返回的token存储在本地,后续请求时放在Authorization请求头中携带,你可以在控制器的构造方法中统一解析头中的令牌,赋值给类属性,所有方法都可以直接获取:

public function __construct()
{
    parent::__construct();
    // 统一解析请求头中的JWT
    $header = $this->input->get_request_header('Authorization');
    if ($header) {
        $token = str_replace('Bearer ', '', $header);
        // 这里可以加JWT验证逻辑,验证通过后赋值给类属性
        $this->jwtoken = $token;
    }
}

内容的提问来源于stack exchange,提问作者Muhammad Bilal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 05:06:04