CodeIgniter登录失败后Toast通知在所有页面重复显示问题
CodeIgniter Toastr 通知持续显示问题的原因及解决方案
问题根源分析
- Toastr脚本无条件执行:你的
includes-bottom.php中未对error_message是否存在做严格判断,导致即使flashdata为空时也会调用toastr.error(),可能因会话数据异常或浏览器缓存重复显示消息。 - 登出函数逻辑错误:先调用
sess_destroy()销毁整个会话,再设置flashdata,此时会话已不存在,flashdata无法被正确存储,反而可能导致会话数据异常残留。 - Session存储异常:若
sess_save_path指定的ci_sessions目录不存在或无写入权限,会话数据无法正常更新,flashdata无法被自动清除。
解决方案
1. 严格控制Toastr脚本的执行条件
修改includes-bottom.php,仅当error_message存在且非空时才渲染Toastr脚本,同时手动清除flashdata确保一次性显示:
<?php $error_msg = $this->session->flashdata('error_message'); if (!empty($error_msg)) : ?> <script> toastr.error('<?php echo htmlspecialchars($error_msg, ENT_QUOTES); ?>'); </script> <?php // 手动清除flashdata,避免残留 $this->session->unset_flashdata('error_message'); endif; ?>
注:使用htmlspecialchars()防止XSS攻击,同时确保输出的字符串符合JS语法要求。
2. 修复登出函数逻辑
不要在sess_destroy()后设置flashdata,改为先清除用户登录相关会话数据,再设置flashdata:
// 清除用户登录态数据(根据实际业务调整键名) $this->session->unset_userdata(['user_id', 'email', 'logged_in']); // 设置登出通知flashdata $this->session->set_flashdata('logout_notification', 'logged_out'); redirect(site_url('login'), 'refresh');
若必须销毁整个会话,可在跳转后重新初始化会话并处理通知,但更推荐只清除用户相关数据,保留会话框架以传递flashdata。
3. 检查Session存储目录配置
确保项目根目录下的ci_sessions目录存在且具备写入权限:
- Linux环境:执行
mkdir ci_sessions和chmod 700 ci_sessions - Windows环境:确保目录对服务器进程(如IIS、Apache)有写入权限
4. 强制刷新会话避免数据残留
在登录失败跳转前强制生成新的会话ID,确保flashdata生命周期正常:
$this->session->set_flashdata('error_message', get_phrase('login_failed')); // 强制生成新会话ID并销毁旧会话 $this->session->sess_regenerate(true); redirect(site_url('login'), 'refresh');
内容的提问来源于stack exchange,提问作者Ali Reza Habibi
相关产品推荐
相关产品推荐

