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

CodeIgniter登录失败后Toast通知在所有页面重复显示问题

CodeIgniter Toastr 通知持续显示问题的原因及解决方案

问题根源分析

  1. Toastr脚本无条件执行:你的includes-bottom.php中未对error_message是否存在做严格判断,导致即使flashdata为空时也会调用toastr.error(),可能因会话数据异常或浏览器缓存重复显示消息。
  2. 登出函数逻辑错误:先调用sess_destroy()销毁整个会话,再设置flashdata,此时会话已不存在,flashdata无法被正确存储,反而可能导致会话数据异常残留。
  3. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 14:25:14