Laravel 5.8:从 javascript 但不是从浏览器调用路由时忽略中间件
Posted
技术标签:
【中文标题】Laravel 5.8:从 javascript 但不是从浏览器调用路由时忽略中间件【英文标题】:Larvel 5.8: middleware ignored when calling route from javascript but not from browser 【发布时间】:2019-09-24 07:44:23 【问题描述】:我有一个 'cors' 中间件,可以简单地做到这一点
public function handle($request, Closure $next)
// return response()->json(['message' => 'Not Found.'], 404);
if (config('app.env') !== 'production')
return $next($request)
->header("Access-Control-Allow-Origin", "*")
->header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');
else
return $next($request);
我以这种方式将中间件添加到routes/api.php
中:
<?php
// Rotte /api/v1
Route::group(['prefix' => 'v1', 'middleware' => ['cors'] ], function ()
... wrapping all /api/v1 routes
当我从浏览器访问网址时,我在开发者选项中看到
但是,当 javscript 调用相同的 url 时,'option' 预检请求失败
从源“https://localhost:3000”对“https://project.local/api/v1/customer”处的 XMLHttpRequest 的访问已被 CORS 策略阻止:对预检请求的响应未通过访问控制检查:没有“Access-Control-Allow-Origin”标头出现在请求的资源上。
我做错了什么?
请注意,要求 laravel 列出我的路线,实际上表明应用了 cors !
php artisan route:list --path api/v1/
+--------+-----------+-------------------------------+------------------+----------------------------------------------------------+---------------------+
| Domain | Method | URI | Name | Action | Middleware |
+--------+-----------+-------------------------------+------------------+----------------------------------------------------------+---------------------+
| | GET|HEAD | api/v1/customer | customer.index | App\Http\Controllers\CustomerController@index | api,cors,jwt.verify |
| | POST | api/v1/customer | customer.store | App\Http\Controllers\CustomerController@store | api,cors,jwt.verify |
| | GET|HEAD | api/v1/customer/customer | customer.show | App\Http\Controllers\CustomerController@show | api,cors,jwt.verify |
| | PUT|PATCH | api/v1/customer/customer | customer.update | App\Http\Controllers\CustomerController@update | api,cors,jwt.verify |
| | DELETE | api/v1/customer/customer | customer.destroy | App\Http\Controllers\CustomerController@destroy | api,cors,jwt.verify |
【问题讨论】:
向我们展示您是如何将中间件添加到路由组的。 感谢回复,我添加了请求的信息 请告诉我们您在哪里注册了cors
作为中间件。
有一个很好的包来处理这个问题:github.com/barryvdh/laravel-cors
【参考方案1】:
请使用额外的标头更新您的中间件,
if (config('app.env') !== 'production')
return $next($request)
->header("Access-Control-Allow-Origin", "*")
->header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');
->header('Access-Control-Allow-Headers', 'Content-Type, Authorization, X-XSRF-TOKEN, X-Requested-With');
这应该可以解决问题。
【讨论】:
您的所有代码似乎都没有问题,除了这些缺少的标头,因此它们可能是导致问题的原因,您可以尝试它是否有效。 哦,对不起,我的意思是“为什么在这种情况下第三个标题是强制性的?” 您正在使用 jwt 身份验证权限,并且还传递数据,因为您将通过请求传递令牌 Authorization 标头将是必需的,对于数据 X-Requested-With 将是必需的,Content- type 让服务器知道你传递的是什么类型的内容,在这种情况下,application/json
。以上是关于Laravel 5.8:从 javascript 但不是从浏览器调用路由时忽略中间件的主要内容,如果未能解决你的问题,请参考以下文章
从 Laravel 5.8 升级到 6.2 后 ConfirmPasswordController 不存在
Laravel Target 类 [register] 从 5.8 版本迁移到 8 后不存在