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

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);
});
根因分析
  1. 请求中断导致Session未持久化
    Laravel的Session写入操作默认是延迟执行的,所有在请求中对Session的增删改操作都先暂存在内存中,会等到请求完整走完生命周期、响应发送给用户之后才会批量持久化到对应的存储介质中。你代码中在Session::put操作之后直接调用了dd()函数,该函数会直接终止请求的后续执行,导致Session持久化的逻辑根本没有运行,本次写入的filter_values从来没有真正被保存到存储里,下一次刷新请求自然拿不到对应的值。
  2. 其他可能的触发原因
  • 路由未挂载到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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 10:36:03