Laravel 5.6中Session数据存储后跨请求无法获取的问题
Laravel 5.6 Session 数据仅当前请求可用的排查方案
这种情况我在Laravel 5.x版本开发时也碰到过,核心问题是Session数据没有被持久化到存储介质,或者后续请求没有正确加载Session。咱们一步步来排查解决:
1. 检查路由是否使用了正确的中间件
Laravel的Session功能完全依赖web中间件组,如果你把路由定义在了api中间件组里,默认是不会启用Session的:
- 打开
routes/web.php,确认你的路由是在默认的web中间件上下文里(Laravel 5.6默认web.php的路由已经自动应用web中间件); - 查看
app/Http/Kernel.php的$middlewareGroups数组,确保web组包含以下两个中间件:\Illuminate\Session\Middleware\StartSession::class, \Illuminate\View\Middleware\ShareErrorsFromSession::class,
如果是API路由需要使用Session,得手动把StartSession中间件添加到api中间件组里。
2. 排查Session驱动配置
这是最常见的坑!打开项目根目录的.env文件:
- 确认
SESSION_DRIVER的值不是array——array驱动是内存级别的Session,数据只存在当前请求生命周期内,后续请求自然拿不到。改成file、cookie或者database都可以; - 如果使用
file驱动,要确保storage/framework/sessions目录有读写权限,Laravel需要在这里创建Session文件。可以执行以下命令修复权限:chmod -R 755 storage/framework/sessions chown -R www-data:www-data storage # 根据你的服务器运行用户调整,比如apache用户可能是apache
3. 确认请求上下文的合法性
- 如果是AJAX请求,要确保前端请求携带了
X-CSRF-TOKEN,并且允许传递Cookie。比如用axios的话,需要设置withCredentials: true,否则Cookie(包含Session ID)不会被传递到后端,自然加载不到之前的Session; - 注意:控制台命令、队列任务这类无状态场景是无法使用Session的,Session仅针对HTTP请求生效。
4. 代码写法的小细节
你代码里同时混用了Session门面和session()辅助函数,虽然这不会直接导致问题,但建议统一写法,比如:
// 存储数据 session()->put('item_data', [1,2,3]); // 获取数据 dump(session()->get('item_data'));
另外,dd()会直接终止脚本执行,极少数情况下可能影响Session的写入流程,你可以换成dump()后再返回响应,确保Session被正常持久化。
先从中间件和Session驱动这两点开始排查,大概率能解决你的问题!
内容的提问来源于stack exchange,提问作者kashfiq
相关产品推荐
相关产品推荐

