Laravel 跨域解决方案「建议收藏」

Laravel 跨域解决方案

大家好,又见面了,我是全栈君。

我们在用 laravel 进行开发的时候,特别是前后端完全分离的时候,由于前端项目运行在自己机器的指定端口 (也可能是其他人的机器) , 例如 localhost:8000 , 而 laravel 程序又运行在另一个端口,这样就跨域了,而由于浏览器的同源策略,跨域请求是非法的。其实这个问题很好解决,只需要添加一个中间件就可以了。

  1. 新建一个中间件
    php artisan make:middleware EnableCrossRequestMiddleware
  2. 书写中间件内容
    <?php
    namespace App\Http\Middleware;
    use Closure;
    class EnableCrossRequestMiddleware
    {
        /**
         * Handle an incoming request.
         *
         * @param  \Illuminate\Http\Request $request
         * @param  \Closure $next
         * @return mixed
         */
        public function handle($request, Closure $next)
        {
            $response = $next($request);
            $origin = $request->server('HTTP_ORIGIN') ? $request->server('HTTP_ORIGIN') : '';
            $allow_origin = [
                'http://localhost:8000',
            ];
            if (in_array($origin, $allow_origin)) {
                $response->header('Access-Control-Allow-Origin', $origin);
                $response->header('Access-Control-Allow-Headers', 'Origin, Content-Type, Cookie, X-CSRF-TOKEN, Accept, Authorization, X-XSRF-TOKEN');
                $response->header('Access-Control-Expose-Headers', 'Authorization, authenticated');
                $response->header('Access-Control-Allow-Methods', 'GET, POST, PATCH, PUT, OPTIONS');
                $response->header('Access-Control-Allow-Credentials', 'true');
            }
            return $response;
        }
    }

    $allow_origin 数组变量就是你允许跨域的列表了,可自行修改。

  3. 然后在内核文件注册该中间件
        protected $middleware = [
            // more
            App\Http\Middleware\EnableCrossRequestMiddleware::class,
        ];

    在 App\Http\Kernel 类的 $middleware 属性添加,这里注册的中间件属于全局中间件。

然后你就会发现前端页面已经可以发送跨域请求了。

会多出一次 method 为 options 的请求是正常的,因为浏览器要先判断该服务器是否允许该跨域请求。

补充

有时候返回的不是 laravel 的 response 对象而是 Symfony 的 response,所以会报 $response->header 方法找不到,所以添加 header 的方法要简单改一下,可以拼好一个数组直接调用一次,我这里是懒得改了。

$response->headers->add(['Access-Control-Allow-Origin' => $origin]);
$response->headers->add(['Access-Control-Allow-Headers' => 'Origin, Content-Type, Cookie,X-CSRF-TOKEN, Accept,Authorization']);
$response->headers->add(['Access-Control-Expose-Headers' => 'Authorization,authenticated']);
$response->headers->add(['Access-Control-Allow-Methods' => 'GET, POST, PATCH, PUT, OPTIONS']);
$response->headers->add(['Access-Control-Allow-Credentials' => 'true']);

补充 2

另外需要注意的是,lumen 框架直接添加这个 中间件是不行的,妥妥的报 options 路由找不到,因为 lumen 用的是 fast-route 路由组件,跟 laravel 的不是同一个,laravel 可以是因为它帮你做了这件事,所以我们要自己注册一个 options路由 , 大致代码如下:

$app->router->group([
    'prefix'     => 'api',
    'middleware' => ['cross','api'],
], function ($router) {
    $router->options('/{path:.*}', function ($path) {});
    require __DIR__ . '/../routes/api.php';
});

bootstrap/app.php

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/112069.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 即使没有翅膀,心。。。。。。也要飞翔

    即使没有翅膀,心。。。。。。也要飞翔

    2021年6月10日
  • 复制网页上不能复制的文章的方法是_文章无法复制

    复制网页上不能复制的文章的方法是_文章无法复制1.F12打开开发者工具,或者鼠标右键–检查2.摁F1,找到DisableJavaScript,勾选,即可复制

    2022年8月31日
  • pycharm背景图片设置不了_qq主页背景图片

    pycharm背景图片设置不了_qq主页背景图片设置背景需要找到BackgroundImage找到BackgroundImage有

    2022年8月28日
  • pycharm修改环境_pycharm更改环境

    pycharm修改环境_pycharm更改环境因为有时需要在Terminal中调试代码,而且调试前需要配置环境变量,虽然操作不麻烦,但用起来总不习惯.特别是项目比较多时,需要频繁进到设置里面去改.以前设置环境变量的操作如下图:Settings-Tools-Terminal-ProjectSettings-Enviromentvariables添加环境变量比如我们有一个文件env.list里面的内容如下:IN_HOST=’192.168.0.6’#数据库主机IPIN_PORT=8888#数据库端口IN_US

    2022年8月27日
  • 【已解决】戴尔笔记本电脑的卡顿问题.

    【已解决】戴尔笔记本电脑的卡顿问题.卡顿检测(主要用于戴尔笔记本):卡顿超过300ms的时候会记录卡顿发生的时间点和卡顿持续的时间.用的是一个Timer(定时器)来检测触发间隔,原理非常简单.此程序使用VB.NET编写,绝无病毒,你可以使用ilspy反编译来查看源代码.在每次开机的时候打开此软件,在每次关机前查看此软件的显示内容,判断是否有卡顿.你可以根据卡顿的状况来判断卡顿是哪些软件造成的.若卡顿出现的不频…

    2022年9月12日
  • 树莓派 Raspberry Pi 连接 WiFi

    树莓派 Raspberry Pi 连接 WiFi说明开启Wifi的不同情况说明:第一种情况:有显示器和鼠标键盘1.1:桌面操作开启WiFi,包含桌面图形的系统(RaspbianStretchwithdesktop)1.2:通过树莓派配置,适用带桌面或仅命令行的系统。1.3:直接修改配置文件,适用带桌面或仅命令行的系统。第二种情况:无显示器和鼠标键盘2.1:使用另一台可用电脑编辑SD卡(但我尝试不成功,ORZ,望…

    2022年5月18日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号