Laravel 5.5:Vue调用的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路由 });
3. 确保前端请求携带Session Cookie
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

