【问题标题】:Session data is not propagated to the next request会话数据不会传播到下一个请求
【发布时间】:2017-12-06 01:43:23
【问题描述】:

Codeigniter 存在问题,我无法修复。当我成功登录并创建必要的会话变​​量时,下一个请求中的重定向无法检索这些变量。 $_SESSION 变量没有它们!

这是当有人提交用户和密码登录时执行的代码:

$data = array(
    'user'      => $this->input->post('user'),
    'password'  => $this->input->post('password'),
);

// Trying to log in
try{
    // Validation ....

    // Users instance creation ....
    $this->user = (...)

    // Last action before the redirection
    $this->session->set_userdata(array(
                'user'          => serialize($this->user),
                'logged_in'     => true,
                'last_access'       => time(),
                'session_max_time'  => config_item('app_sess_expiration'),
        ));

    // At this point, if I do a var_dump($_SESSION), it will display all my session variables as expected.

    redirect(base_url());
}
catch (Exception $e) {
    // Not reaching this code
    $data['error'] = $e->getMessage();
    redirect_to_login();
}

现在如果我在 system/libraries/Session/Session.php 中的 session_start() 之后 var_dump($_SESSION) 只会在重定向请求中显示:

Array
(
    [__ci_last_regenerate] => 1499021453
)

我自己的会话变量丢失了!

我已经检查过,每次我尝试进行身份验证时,都会创建一个新的会话变量:

luis@luis-pc ~ $ ls -la /opt/lampp/temp
total 20312
drwxrwxrwx  2 daemon daemon    24576 jul  2 21:16 .
drwxr-xr-x 30 root   root       4096 jun 19 22:37 ..
-rw-------  1 daemon daemon 20735126 jun 20 22:14 phpjtS2zn
-rw-------  1 daemon daemon       34 jul  2 20:50 session_myapp51697449f5b8d526ee2cce05a5149135e3c1d74f
-rw-------  1 daemon daemon      785 jul  2 21:16 session_myapp72d8e8c189283c1d5c5d4ed60d7dd58ed5d9d69c
-rw-------  1 daemon daemon       34 jul  2 21:16 session_myapp9a97c65cda1c846028fc3035abe5023a73cf974b
-rw-------  1 daemon daemon       34 jul  2 21:16 session_myappf122822e7c8887b14239eb9e97d70266d47c658b
-rw-------  1 daemon daemon    14891 jul  2 21:15 sess_50fbaf84f2b49bf7c176b8c0396c099e

我不确定文件权限是否可以做。我为 temp 目录中的所有用户授予读取权限,但所有会话文件都是使用仅所有者权限创建的。但是我认为守护进程也是运行进程的所有者,不是吗?所以应该检索会话文件。

编辑 1:

这是我在 config.php 文件中设置的会话

$config['sess_driver'] = 'files';
$config['sess_cookie_name'] = 'session_myapp';
$config['sess_expiration'] = 0; 
$config['sess_save_path'] = "/opt/lampp/temp";
$config['sess_match_ip'] = FALSE;
$config['sess_time_to_update'] = 30;
$config['sess_regenerate_destroy'] = FALSE;

【问题讨论】:

  • 你有没有想过使用codeigniter表单验证codeigniter.com/user_guide/libraries/form_validation.html
  • CI 会话与 PHP 会话是分开的。它们存储在您定义的文件或数据库表中。那么你的 config.php 文件中的 CI Sessions 配置设置是什么?
  • @TimBrownlaw 我使用文件存储选项。我已按照您的要求添加了会话配置行。
  • 我认为你很困惑......你应该只使用 $_SESSION 或 CI 的会话。它们是不同的...如果您使用 CI Sessions 设置会话 var 它不会出现在 $_SESSION 中...因此如果您使用的是 CI 会话,您可以使用类似 var_dump($this->session->userdata ());
  • 另外,您的会话保存路径应该在您的文档根目录中。您正在尝试将会话写入需要 root 权限的系统文件夹。

标签: php codeigniter session codeigniter-3


【解决方案1】:
if($_POST['user'] && $_POST['password'])

{ 

$this->session->set_userdata(array(

'user'          => serialize($this->user),
'logged_in'     => true,
'last_access'       => time(),
'session_max_time'  => config_item('app_sess_expiration'),
));
}

【讨论】:

  • 我设置会话数据时有 $_POST['user'] 和 $_POST['password']
  • 只有当 POST 值从上一页传递过来时才设置会话。否则会话值将被保存为空。所以我建议尝试上面的代码.....
  • 正如我告诉你的,当我设置会话变量时,POST 已经被填充。我做一个验证来检查它,在这种情况下会抛出并捕获一个异常。我省略了验证,因为它不相关(只有一条评论提到它)。
【解决方案2】:

您必须在创建会话之前进行查询 .. 类似这样的东西;

if($query->num_array() > 0){


//create your own session data ..

}

还要确保你把它放在 config/autoload 中

$autoload['libraries'] = array('database', 'session');

并尝试其他浏览器,或清除浏览器 cookie 并重试。

【讨论】:

  • 我已经将会话库添加到自动加载器中,并且我正在为会话使用文件存储配置,而不是数据库。
猜你喜欢
  • 2019-10-31
  • 2016-11-22
  • 2021-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-23
  • 1970-01-01
  • 2010-10-03
相关资源
最近更新 更多