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

Laravel 5.5:Vue调用的API路由控制器中Session无法正常工作

解决思路:API路由无法访问Session的问题

这个问题我之前也碰到过,核心原因是Laravel的API路由默认是无状态设计,默认的routes/api.php路由组没有加载Session相关的中间件,所以不管你怎么配置Session驱动,API请求都不会触发Session的读写操作,自然sessions表也不会有数据。下面是一步步的解决方案:


1. 补做关键迁移步骤

你提到已经运行了php artisan session:table生成了迁移文件,但别忘了执行迁移来实际创建sessions表:

php artisan migrate

如果这步没做,就算配置了数据库驱动,Session也没有存储的地方,这可能是sessions表一直为空的核心原因之一。


2. 给API路由添加Session中间件

Laravel的web中间件组默认包含了Session相关的所有必要中间件(比如EncryptCookies、StartSession),但api中间件组没有。你有两种方式给需要Session的API路由补上这些中间件:

方式一:绑定web中间件组(最简单)

打开routes/api.php,把需要访问Session的路由放在web中间件组的闭包内:

Route::middleware(['web'])->group(function () {
    // 这里放你的API路由,比如:
    Route::get('/your-api-endpoint', [YourApiController::class, 'targetMethod']);
});

这种方式直接复用web路由的Session配置,无需额外配置单个中间件。

方式二:仅加载必要的Session中间件(更细粒度)

如果你不想加载web中间件组里的其他非必要中间件,可以单独指定Session相关的核心中间件:

Route::middleware([
    \App\Http\Middleware\EncryptCookies::class,
    \Illuminate\Session\Middleware\StartSession::class,
])->group(function () {
    // 你的API路由
});

Vue调用API时,默认不会自动携带Cookie,所以需要配置axios允许携带Credentials:

// 在Vue的axios全局配置中添加
axios.defaults.withCredentials = true;

同时,后端要配置CORS允许携带Credentials:
打开config/cors.php,修改两个关键配置项:

// 允许请求携带Cookie
'supports_credentials' => true,
// 不能用通配符*,要指定你的前端域名,比如['http://localhost:8080']
'allowed_origins' => ['http://localhost:8080'],

4. 控制器使用Session的注意事项

  • 如果你用$request->session()->get('client'),必须确保请求已经经过Session中间件处理,否则会抛出“Session store not set on request.”错误——这本质还是中间件未加载的问题,解决步骤2后就会消失。
  • 使用Session::get('client')或者session('client')时,务必确保控制器顶部已引入Session门面:
use Illuminate\Support\Facades\Session;

额外建议:API优先采用无状态认证

虽然上面的方法能解决问题,但API设计的最佳实践是无状态的。如果你的场景是要识别用户,更推荐用Laravel Sanctum或者Passport来做Token认证,而非依赖Session——Session是基于Cookie的有状态设计,跨域场景下容易出现兼容性问题,也不符合RESTful原则。

内容的提问来源于stack exchange,提问作者Wayne Smallman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:07:36