【发布时间】:2023-03-03 05:18:19
【问题描述】:
我有一个 Web 应用程序,在其中我提供了注销的选项。注销时会话被破坏,即。由 system>libraries>Session.php 中的 sess_destroy() 删除。
但是每当用户注销时,与用户对应的令牌被删除,而是在会话表中创建新令牌,没有任何用户数据。
以下是我再次将用户重定向到登录页面时所经历的流程,流程是这样的,
注销 -> 登录页面中的 __construct() -> CI_Controller 中的 __construct() -> Loader.php 中的initialize() -> Loader.php 中的 _ci_autoloader() -> autoload.php 中的 $autoload['libraries'] -> Session.php 中的 __construct() ->
if ( ! $this->sess_read()) {
$this->sess_create();
} else {
$this->sess_update();
}
然后在 sess_read() 中,
$session = $this->CI->input->cookie($this->sess_cookie_name);
// No cookie? Goodbye cruel world!...
if ($session === FALSE)
{
log_message('debug', 'A session cookie was not found.');
return FALSE;
}
因此它进入 sess_create() 并创建另一个会话,
$this->userdata = array(
'session_id' => md5(uniqid($sessid, TRUE)),
'ip_address' => $this->CI->input->ip_address(),
'user_agent' => substr($this->CI->input->user_agent(), 0, 120),
'last_activity' => $this->now,
'user_data' => ''
);
当会话被创建时,它被分配给 cookie,当会话被销毁时,该 cookie 被删除。但是一旦加载了新页面并加载了会话库,它就会在会话表中插入新行。
这会增加数据库的大小,我希望社区就此事提出建议。还有其他人面临同样的问题吗?
附言我正在使用 CI2
会话终止,
function sess_destroy()
{
// Kill the session DB row
if ($this->sess_use_database === TRUE && isset($this->userdata['session_id']))
{
$this->CI->db->where('session_id', $this->userdata['session_id']);
$this->CI->db->delete($this->sess_table_name);
}
// Kill the cookie
setcookie(
$this->sess_cookie_name,
addslashes(serialize(array())),
($this->now - 31500000),
$this->cookie_path,
$this->cookie_domain,
0
);
// Kill session data
$this->userdata = array();
}
【问题讨论】:
-
请告诉我们你是如何破坏你的会话
-
@Lithilion 请检查更新的代码。谢谢
-
我假设您销毁会话和数据并重定向到“注销”页面或索引。会不会是你在那里开始一个新的会话?
-
是的,当用户注销时,我将用户重定向到登录页面。当控制流转到 autoload.php 时,会加载会话库,并且在会话的构造中,另一个会话会在没有任何数据的情况下启动。
标签: php codeigniter session