Laravel开启跨域的方法

news/2024/7/2 11:22:17


1、建立中间件Cors.php 
命令:php artisan make:middleware Cors 
/app/Http/Middleware/ 目录下会出现一个Cors.php 文件。

内容如下:

<?phpnamespace App\Http\Middleware;use Closure;class Cors
{/*** Handle an incoming request.** @param  \Illuminate\Http\Request  $request* @param  \Closure  $next* @return mixed*/public function handle($request, Closure $next){$response = $next($request);$response->header('Access-Control-Allow-Origin', '*');$response->header('Access-Control-Allow-Headers', 'Origin, Content-Type, Cookie, Accept, multipart/form-data, application/json');$response->header('Access-Control-Allow-Methods', 'GET, POST, PATCH, PUT, OPTIONS');$response->header('Access-Control-Allow-Credentials', 'false');return $response;}
}

其中有以下需要注意的地方:

  • 对于跨域访问并需要伴随认证信息的请求,需要在 XMLHttpRequest 实例中指定 withCredentials 为 true。
  • 这个中间件你可以根据自己的需求进行构建,如果需要在请求中伴随认证信息(包含 cookie,session)那么你就需要指定 Access-Control-Allow-Credentials 为 true, 因为对于预请求来说如果你未指定该响应头,那么浏览器会直接忽略该响应。
  • 在响应中指定 Access-Control-Allow-Credentials 为 true 时,Access-Control-Allow-Origin 不能指定为 *(这个一定要注意,我就是在这个地方调了好久)
  • 后置中间件只有在正常响应时才会被追加响应头,而如果出现异常,这时响应是不会经过中间件的。

2、在 Kernel.php文件中的$middleware中加入刚刚添加的中间件:\App\Http\Middleware\Cors::class, 

protected $middleware = [\Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,\App\Http\Middleware\EncryptCookies::class,\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,\Illuminate\Session\Middleware\StartSession::class,\Illuminate\View\Middleware\ShareErrorsFromSession::class,\App\Http\Middleware\Cors::class,];

 

跨源资源共享标准

跨源资源共享标准通过新增一系列 HTTP 头,让服务器能声明哪些来源可以通过浏览器访问该服务器上的资源。另外,对哪些会对服务器数据造成破坏性响应的 HTTP 请求方法(特别是 GET 以外的 HTTP 方法,或者搭配某些 MIME 类型的 POST 请求),标准强烈要求浏览器必须先以 OPTIONS 请求方式发送一个预请求(preflight request),从而获取知服务器端对跨源请求所支持 HTTP 方法。在确认服务器允许跨源请求的情况下,以实际的 HTTP 请求方法发送那个真正的请求。服务器端也可以通知客户端,是不是需要随同请求一起发送信用信息(包括 Cookies 和 HTTP 认证相关数据)。

跨源共享标准需要浏览器和服务端共同配合才能完成,目前浏览器厂商已经可以将请求部分自动完成,所以跨源资源访问的重点还是在于服务器端。

下面列出一些标准中可用的响应头和请求头。

Response Header

Access-Control-Allow-Origin : 指明哪些请求源被允许访问资源,值可以为 “*”,”null”,或者单个源地址。

Access-Control-Allow-Credentials : 指明当请求中省略 creadentials 标识时响应是否暴露。对于预请求来说,它表明实际的请求中可以包含用户凭证。

Access-Control-Expose-Headers : 指明哪些头信息可以安全的暴露给 CORS API 规范的 API。

Access-Control-Max-Age : 指明预请求可以在预请求缓存中存放多久。

Access-Control-Allow-Methods : 对于预请求来说,哪些请求方式可以用于实际的请求。

Access-Control-Allow-Headers : 对于预请求来说,指明了哪些头信息可以用于实际的请求中。

Origin : 指明预请求或者跨域请求的来源。

Access-Control-Request-Method : 对于预请求来说,指明哪些预请求中的请求方式可以被用在实际的请求中。

Access-Control-Request-Headers : 指明预请求中的哪些头信息可以用于实际的请求中。

Request Header

Origin : 表明发送请求或预请求的来源。

Access-Control-Request-Method : 在发送预请求时带该请求头,表明实际的请求将使用的请求方式。

Access-Control-Request-Headers : 在发送预请求时带有该请求头,表明实际的请求将携带的请求头。

 

转自:https://blog.csdn.net/leedaning/article/details/53787008

转载于:https://www.cnblogs.com/lamp01/p/8892001.html


http://lihuaxi.xjx100.cn/news/237030.html

相关文章

最常见的 35 个 Python 面试题及答案

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 作为一个 Python 新手&#xff0c;你必须熟悉基础知识。在本文中我们将讨论一些 Python 面试的基础问题和高级问题以及答案&#xff0c;以帮助你完…

Hive 中的变量

Hive的变量前面有一个命名空间&#xff0c;包括三个hiveconf&#xff0c;system&#xff0c;env&#xff0c;还有一个hivevar hiveconf的命名空间指的是hive-site.xml下面的配置变量值。system的命名空间是系统的变量&#xff0c;包括JVM的运行环境。env的命名空间&#xff0c;…

WebAssembly Studio:Mozilla提供的WASM工具

\看新闻很累&#xff1f;看技术新闻更累&#xff1f;试试下载InfoQ手机客户端&#xff0c;每天上下班路上听新闻&#xff0c;有趣还有料&#xff01;\\\WebAssembly Studio是Mozilla开发的一款在线工具&#xff0c;用于将C/C和Rust代码编译为WASM格式。\\WebAssembly Studio是M…

浅谈WPF的VisualBrush

原文:浅谈WPF的VisualBrush首先看看VisualBrush的解释&#xff0c;msdn上面的解释是使用 Visual 绘制区域&#xff0c;那么我们再来看看什么是Visual呢&#xff1f;官方的解释是&#xff1a;获取或设置画笔的内容&#xff0c;Visual 是直接继承自DependencyObject&#xff0c;U…

我不喜欢Go语言的十个理由

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 Go 语言有多火爆&#xff1f;国外如 Google、AWS、Cloudflare、CoreOS 等&#xff0c;国内如七牛、阿里、知乎等都已经开始大规模使用 Go 语言开发…

C++ Reference: Standard C++ Library reference: Containers: list: list: ~list

C官网参考链接&#xff1a;https://cplusplus.com/reference/list/list/~list/ 公有成员函数 <list> std::list::~list ~list(); 列表的析构函数 销毁容器对象。 C98 这将销毁所有容器元素&#xff0c;并使用它的分配器&#xff08;allocator&#xff09;释放list容器分…

TypeScript学习笔记之 接口(Interface)

在java中&#xff0c;接口是用来定义一些规范&#xff0c;使用这些接口&#xff0c;就必须实现接口中的方法&#xff0c;而且接口中的属性必须是常量。javascript中是没有接口的概念的。所以TypeScript在编译成 JavaScript 的时候&#xff0c;所有的接口都会被擦除掉。 而TypeS…

Go语言的前景分析

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 抓住时代的趋势 在上篇文章中&#xff0c;也就是那个跨维度的打击&#xff0c;是可以直接秒杀的中&#xff0c;提到这个时代的问题&#xff0c;这次…