Laravel控制器index可读取Session但Axios请求API无法获取如何解决
问题产生原因
- Laravel 路由默认分为
web和api两个独立中间件组,routes/api.php下的所有路由默认归属api中间件组,该组基于无状态API设计,默认没有挂载\Illuminate\Session\Middleware\StartSession::class等会话相关中间件,不会初始化会话上下文,因此无法读取web端写入的Session数据。 - 即便给API路由配置了Session中间件,前端Axios请求如果未携带会话Cookie(跨域场景下必须显式开启凭证携带),后端也无法识别到对应会话,同样读不到Session值。
- 额外排查点:你提供的代码中路由绑定的是
UserProjectController::class,但控制器定义的类名为ProjectController,如果两者不是同一个类、或命名空间不匹配,也会导致逻辑异常,注意核对。
解决方案
根据使用场景选择对应方案即可:
- 方案1:将同站业务接口放到web路由组
如果该接口仅给站内前端页面调用,不需要对外提供开放API服务,直接将路由定义到routes/web.php文件即可,web中间件组默认带Session支持,无需额外修改配置。 - 方案2:给API路由追加Session中间件
如果必须放在api.php下,可以给需要读取Session的路由单独追加web中间件,修改routes/api.php代码:
Route::prefix('user')->middleware('web')->group(function(){ Route::post('projects',[UserProjectController::class, 'getProjects']); });
如果需要给所有API路由开启Session支持,修改app/Http/Kernel.php的$middlewareGroups配置,给api组追加会话相关中间件:
protected $middlewareGroups = [ 'web' => [ // 原有web中间件保持不变 ], 'api' => [ \Illuminate\Cookie\Middleware\EncryptCookies::class, \Illuminate\Session\Middleware\StartSession::class, 'throttle:api', \Illuminate\Routing\Middleware\SubstituteBindings::class, ], ];
- 方案3:配置Axios携带会话凭证
修改前端Axios请求代码,开启withCredentials配置,确保请求自动携带会话Cookie:
mounted(){ axios.post('/api/user/projects', {}, { withCredentials: true }) .then(response=>{ console.log(response.data.data) }) }
如果全局请求都需要携带凭证,可以统一配置:
axios.defaults.withCredentials = true;
如果是跨域场景,还要额外修改config/cors.php配置:
// 开启凭证支持 'supports_credentials' => true, // 不允许使用*通配符,必须配置具体的前端域名 'allowed_origins' => ['http://你的前端域名:端口'],
内容的提问来源于stack exchange,提问作者Penny
相关产品推荐
相关产品推荐

