laravel/lumen使用CROS解决跨域问题

Posted autofelix

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了laravel/lumen使用CROS解决跨域问题相关的知识,希望对你有一定的参考价值。

〝 古人学问遗无力,少壮功夫老始成 〞

在大公司中,业务都是前后端分离的,这就导致页面域名和请求域名以及资源域名经常不同,所以存在各种各样的跨域问题,最简单的当然是使用jsonp解决,但是如果接口风格是rest的,还有delete、put等请求,jsonp就不够用了,因为jsonp只支持get请求方式。

目录

一、新建中间件

二、注册中间件

三、注意


一、新建中间件

  • 其实在laravel/lumen框架中解决跨域问题,使用的是后端语言设置解决
  • 如果你不懂跨域和跨域的原理,请查看博主另一篇文章:什么是跨域?如何解决跨域?
  •  app/Http/Middleware 里新建一个 CorsMiddleware.php,并写入如下代码: 

<?php
namespace App\\Http\\Middleware;


use Illuminate\\Http\\Request;
use Illuminate\\Http\\Response;

class CorsMiddleware

    private $headers;
    private $allow_origin;

    public function handle(Request $request, \\Closure $next)
    
        $this->headers = [
            'Access-Control-Allow-Methods' => 'GET, POST, PUT, DELETE',
            'Access-Control-Allow-Headers' => $request->header('Access-Control-Request-Headers'),
            'Access-Control-Allow-Credentials' => 'true',//允许客户端发送cookie
            'Access-Control-Max-Age' => 1728000 //该字段可选,用来指定本次预检请求的有效期,在此期间,不用发出另一条预检请求。
        ];

        $this->allow_origin = [
            'http://api.autofelix.com',
            'http://staticres.autofelix.com'
            // 请在这里设置自定义允许访问的域名
        ];
        $origin = isset($_SERVER['HTTP_ORIGIN']) ? $_SERVER['HTTP_ORIGIN'] : '';

        //如果origin不在允许列表内,直接返回403
        if (!in_array($origin, $this->allow_origin) && !empty($origin))
            return new Response('Forbidden', 403);
        //如果是复杂请求,先返回一个200,并allow该origin
        if ($request->isMethod('options'))
            return $this->setCorsHeaders(new Response('OK', 200), $origin);
        //如果是简单请求或者非跨域请求,则照常设置header
        $response = $next($request);
        $methodVariable = array($response, 'header');
        //这个判断是因为在开启session全局中间件之后,频繁的报header方法不存在,所以加上这个判断,存在header方法时才进行header的设置
        if (is_callable($methodVariable, false, $callable_name)) 
            return $this->setCorsHeaders($response, $origin);
        
        return $response;
    

    /**
     * @param $response
     * @return mixed
     */
    public function setCorsHeaders($response, $origin)
    
        foreach ($this->headers as $key => $value) 
            $response->header($key, $value);
        
        if (in_array($origin, $this->allow_origin)) 
            $response->header('Access-Control-Allow-Origin', $origin);
         else 
            $response->header('Access-Control-Allow-Origin', '');
        
        return $response;
    

二、注册中间件

  •  boostrap/app.php 里注册一下全局中间件即可完成 

$app->middleware([
    \\App\\Http\\Middleware\\CorsMiddleware::class,
]);

三、注意

  • 默认情况下,cookie是不包括在CORS请求中的,如果服务器要接受cookie,必须设置下面
  • 如果不需要cookie,则必须删除该字段,改false是没用的,这个值只能是true

'Access-Control-Allow-Credentials'=> 'true'

以上是关于laravel/lumen使用CROS解决跨域问题的主要内容,如果未能解决你的问题,请参考以下文章

SpringBoot的Cros跨域问题经常始终不能解决跨域的原因

SpringBoot的Cros跨域问题经常始终不能解决跨域的原因

SpringBoot的Cros跨域问题经常始终不能解决跨域的原因

SpringBoot的Cros跨域问题经常始终不能解决跨域的原因

解决vue nodejs中cros跨域cookie和session失效的问题

springboot之跨域访问cros,@CrossOrigin注解