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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 02:12:01