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 从动态表单更新数据

从 Laravel 5.8 升级到 6.2 后 ConfirmPasswordController 不存在

Laravel Target 类 [register] 从 5.8 版本迁移到 8 后不存在

Laravel 5.8刀片,从嵌套对象错误中获取值

laravel 5.8 在 getenv 上返回 false

CORS 策略已阻止访问 XMLHttpRequest - Laravel 5.8