PHP CodeIgniter会话ID无法重新生成

时间:2018-04-11 02:33:54

标签: php codeigniter session

我遇到会话ID无法重新生成的问题。这是我的配置

$config['sess_driver'] = 'database';
$config['sess_cookie_name'] = 'ci_session';
$config['sess_expiration'] = 60; // 15 minutes
$config['sess_save_path'] = 'ci_sessions';
$config['sess_match_ip'] = FALSE;
$config['sess_time_to_update'] = 30; // 5 minutes
$config['sess_regenerate_destroy'] = TRUE;

我将它设置为非常短的实验时间范围。当我注册用户时,我设置了一个名为user_id的会话变量,然后加载一个不同的页面。在注册时,会话变量的输出是

[code]session_id() = kvrphe8... 
timestamp (from ci_sessions) = 1523413499
user_id = user87B...

如果我等了40秒然后通过ajax查询这些相同的变量(没有重新加载页面),我得

session_id() = kvrphe8... 
timestamp (from ci_sessions) = 1523413499
user_id =user87B...

为什么会话ID在30秒后没有重新生成?如果我等待超过60秒,则会按预期销毁会话,并且session_id()会更改。但在这种情况下,它不应该每30秒更换一次吗?我还希望会话在30秒内被销毁,因为sess_regenerate_destroy = TRUE,但这显然也没有发生。

由于

2 个答案:

答案 0 :(得分:0)

$this->load->library('session');

if (($this->userdata['last_activity']+30) >= $this->now)
{
 $this->session->sess_regenerate();
}

您必须使用上述功能重新生成。

调用session_id()意味着只是让会话ID不能重新生成。

答案 1 :(得分:0)

您所看到的是因为CodeIgniter在AJAX服务器请求期间不会重新生成会话。

这是有道理的,因为当前在浏览器中的页面没有被重新加载"如果会话ID要改变,那将是必需的。更改会话ID意味着加载页面时发送的会话cookie将不再有效。

查看system/Session.php中的类构造函数,您将看到(在调用session_start();之后,当发出ajax请求时,没有完成会话重新生成。