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

Laravel 7切换数据库Session后刷新页面ID重生成致自动登出

问题排查与解决方案

针对你遇到的Laravel 7.30.6切换到数据库会话驱动后,刷新页面就丢失会话的问题,按以下步骤排查:

1. 检查会话表结构是否正确

确保sessions表的结构完全符合Laravel要求,官方迁移生成的标准结构如下:

CREATE TABLE `sessions` (
  `id` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
  `user_id` bigint(20) unsigned DEFAULT NULL,
  `ip_address` varchar(45) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `user_agent` text COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `payload` text COLLATE utf8mb4_unicode_ci NOT NULL,
  `last_activity` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `sessions_user_id_index` (`user_id`),
  KEY `sessions_last_activity_index` (`last_activity`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

如果是手动创建的表,重点核对:id字段必须是varchar(255)(不能用int类型),payload为text类型,last_activity为int类型,且包含对应索引。

2. 清除配置缓存

切换会话驱动后,旧配置可能仍在缓存中生效,执行以下命令清除:

php artisan config:clear
php artisan cache:clear

3. 修正Cookie相关配置

  • SESSION_DOMAIN:若网站有子域名(如app.example.com),需设置为.example.com(注意前缀的点);本地开发可留空或设为localhost。错误的域名会导致浏览器无法携带会话Cookie,每次请求都新建会话。
  • SESSION_SECURE_COOKIE:网站使用HTTPS时必须设为true,HTTP环境设为false,否则浏览器可能拒绝保存Cookie。
  • same_site:Laravel 7默认same_site为null,可尝试在config/session.php中改为:
    'same_site' => 'lax',
    

4. 验证数据库权限

确保数据库用户对sessions表拥有完整读写权限,可手动执行SQL测试:

INSERT INTO sessions (id, payload, last_activity) VALUES ('test_id', 'test_payload', UNIX_TIMESTAMP());
UPDATE sessions SET last_activity = UNIX_TIMESTAMP() WHERE id = 'test_id';
DELETE FROM sessions WHERE id = 'test_id';

若执行失败,需给数据库用户添加对应表的读写权限。

5. 检查中间件顺序

确认web中间件组包含StartSession且顺序正确,app/Http/Kernel.php中默认的web中间件组应为:

protected $middlewareGroups = [
    'web' => [
        \App\Http\Middleware\EncryptCookies::class,
        \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
        \Illuminate\Session\Middleware\StartSession::class,
        // \Illuminate\Session\Middleware\AuthenticateSession::class,
        \Illuminate\View\Middleware\ShareErrorsFromSession::class,
        \App\Http\Middleware\VerifyCsrfToken::class,
        \Illuminate\Routing\Middleware\SubstituteBindings::class,
    ],
];

StartSession必须在EncryptCookies和AddQueuedCookiesToResponse之后,确保会话能正常启动。

6. 排查自定义代码干扰

  • 检查全局/路由中间件中是否有意外调用session()->invalidate()或session()->regenerate()的逻辑。
  • 确认登录逻辑仅使用Auth::login($user),避免手动设置会话后触发不必要的会话重建。

7. 清理浏览器Cookie测试

本地开发时,关闭浏览器隐私模式或手动清除Cookie后重新测试,旧Cookie可能会干扰新会话的建立。


内容的提问来源于stack exchange,提问作者SedaxGaming

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 12:15:01