Laravel 9.x 中间件中可用 Session,但需确保 StartSession 中间件已正确加载且顺序靠前;自定义中间件须置于其后;API 路由默认无 Session;避免提前终止流程;驱动须匹配环境(如生产用 redis);严禁直接操作 $_SESSION。

在 Laravel 9.x 中间件里使用 Session,核心不是“能不能用”,而是“什么时候能用、怎么用才安全”。关键陷阱往往出现在中间件执行时机、驱动配置和写入方式上,稍不注意就会出现 session() is null、数据不持久、重定向死循环或线上 session 失效等问题。
确保 StartSession 中间件已加载且顺序正确
Session 不是全局可用的魔法变量——它必须由 \Illuminate\Session\Middleware\StartSession::class 显式挂载。这个中间件负责解密 Cookie、读取存储、绑定 session 实例到 request。
- 检查
app/Http/Kernel.php的$middlewareGroups['web']数组,确认StartSession存在且位置靠前(通常在EncryptCookies之后、VerifyCsrfToken之前) - 自定义中间件若需读写 session,必须放在
StartSession之后;否则session()或$request->session()返回空对象 - API 路由默认不包含该中间件,所以
Route::middleware('api')下的中间件无法访问 session —— 如需 session,请显式加web中间件或改用 token 认证
别在中间件里提前终止流程而跳过 session 提交
Session 数据最终要写回存储(redis/file/database),这个动作发生在响应即将发送时,由 StartSession::terminate() 完成。如果中间件提前返回响应(比如重定向或异常),但没让请求走完完整中间件链,session 变更可能丢失。
使用 Playwright 为 jimeng.jianying.com 管理浏览器会话,导入 cookies/localStorage 以自动化视频生成工作流,支持图片上传等功能
- 避免在中间件中使用
exit、die或直接 echo 输出 - 重定向请统一用
return redirect()->route(...)或response()->redirectToRoute(...) - 若做权限拦截并返回 JSON,确保仍调用
$next($request)后再处理响应,或手动触发 session 保存(不推荐,应靠标准流程)
Session 驱动与环境配置必须匹配
本地开发用 file 驱动没问题,但上线后若未切换,高并发下极易丢 session 或卡住。
- 生产环境务必改用
redis或database,并在.env中设SESSION_DRIVER=redis,同时确认REDIS_HOST和密码配置正确 - 选
database驱动时,必须运行php artisan session:table && php artisan migrate,否则session()->put()看似成功,实际无记录 - 切忌留
array驱动上线——它只在单次请求内有效,刷新即丢
读写操作要用 Laravel API,别碰 $_SESSION
直接操作 $_SESSION 会绕过加密、签名、GC 和序列化逻辑,导致 flash 数据失效、跨请求丢失,甚至抛出 Serialization of closure is not allowed 错误。
- 存值:用
session(['key' => 'value'])或$request->session()->put('key', $value) - 取值:用
session('key', 'default')(带默认值更健壮) - 删除:用
session()->forget('key')—— 注意它不支持点号路径(如cart.items),只认一级 key - 闪存:必须用
session()->flash('msg', 'success'),不要用put模拟










