Laravel 中刷新页面后 Session 返回 null 的原因是什么?
测试代码复现
Route::get("test", function (){ $result = \Illuminate\Support\Facades\Session::get("filter_values"); \Illuminate\Support\Facades\Session::forget("filter_values"); \Illuminate\Support\Facades\Session::put('filter_values', "abcdef"); dd("result: ", $result); });
根因分析
- 请求中断导致Session未持久化
Laravel的Session写入操作默认是延迟执行的,所有在请求中对Session的增删改操作都先暂存在内存中,会等到请求完整走完生命周期、响应发送给用户之后才会批量持久化到对应的存储介质中。你代码中在Session::put操作之后直接调用了dd()函数,该函数会直接终止请求的后续执行,导致Session持久化的逻辑根本没有运行,本次写入的filter_values从来没有真正被保存到存储里,下一次刷新请求自然拿不到对应的值。 - 其他可能的触发原因
- 路由未挂载到
web中间件组:只有web中间件组默认引入了StartSession中间件,没有该中间件的情况下Session不会初始化,所有操作都不会生效 - Session驱动配置错误:如果使用
array作为Session驱动,所有Session数据仅在当前请求的内存中生效,请求结束直接销毁,无法跨请求读取
修复方案
- 替换
dd()调试语句为正常的响应输出,让请求可以完整执行完成,Session会自动持久化,示例:
Route::get("test", function (){ $result = \Illuminate\Support\Facades\Session::get("filter_values"); \Illuminate\Support\Facades\Session::forget("filter_values"); \Illuminate\Support\Facades\Session::put('filter_values', "abcdef"); return "result: ".$result; });
- 如果需要保留
dd()调试,可以在Session操作后手动调用save()方法强制持久化:
\Illuminate\Support\Facades\Session::put('filter_values', "abcdef"); \Illuminate\Support\Facades\Session::save(); dd("result: ", $result);
- 确认路由定义在
routes/web.php文件下,或者手动给路由添加web中间件 - 检查
config/session.php中的driver配置,本地开发推荐使用file驱动,生产环境推荐使用redis/database驱动,不要使用array驱动
内容的提问来源于stack exchange,提问作者oy3
相关产品推荐
相关产品推荐

