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
相关产品推荐
相关产品推荐

