Laravel开启跨域请求的方法


Posted in PHP onOctober 13, 2019

项目中用到了接口,外部调用的时候老是请求不到,本地请求却没问题,查了下说是因为跨域的问题。

根据网上所说解决方法如下:

1、建立中间件Cors.php

命令:php artisan make:middleware Cors

在/app/Http/Middleware/ 目录下会出现一个Cors.php 文件。

2、在handle 方法中加入如下内容:

$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 不能指定为 *(这个一定要注意,我就是在这个地方调了好久)

后置中间件只有在正常响应时才会被追加响应头,而如果出现异常,这时响应是不会经过中间件的。

Cors.php文件内容如下:

<?php

namespace 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;
 }
}

3、在 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 : 在发送预请求时带有该请求头,表明实际的请求将携带的请求头。

Author:leedaning

以上这篇Laravel开启跨域请求的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
phpinfo 系统查看参数函数代码
Jun 05 PHP
PHP取得一个类的属性和方法的实现代码
May 22 PHP
php curl模拟post请求小实例
Nov 13 PHP
Thinkphp中的curd应用实用要点
Jan 04 PHP
浅析PHP中call user func()函数及如何使用call user func调用自定义函数
Nov 05 PHP
学习thinkphp5.0验证类使用方法
Nov 16 PHP
PHP实现支持CURL字符串证书传输的方法
Mar 23 PHP
解决php extension 加载顺序问题
Aug 16 PHP
mac pecl 安装php7.1扩展教程
Oct 17 PHP
PHP实现发送微博消息功能完整示例
Dec 04 PHP
PHP实现提取多维数组指定一列的方法总结
Dec 04 PHP
Laravel框架中队列和工作(Queues、Jobs)操作实例详解
Apr 06 PHP
浅谈Laravel中的三种中间件的作用
Oct 13 #PHP
laravel config文件配置全局变量的例子
Oct 13 #PHP
Laravel 读取 config 下的数据方法
Oct 13 #PHP
laravel实现前后台路由分离的方法
Oct 13 #PHP
Laravel数据库读写分离配置的方法
Oct 13 #PHP
Laravel第三方包报class not found的解决方法
Oct 13 #PHP
php7性能提升的原因详解
Oct 13 #PHP
You might like
雄兵连三大错觉:凯莎没了,凉冰阵亡了,华烨觉得自己又行了
2020/04/09 国漫
php+mysql写的简单留言本实例代码
2008/07/25 PHP
php 显示指定路径下的图片
2009/10/29 PHP
又拍云异步上传实例教程详解
2016/04/19 PHP
解决PHP程序运行时:Fatal error: Maximum execution time of 30 seconds exceeded in的错误提示
2016/11/25 PHP
PHPTree――php快速生成无限级分类
2018/03/30 PHP
详解PHP多个进程配合redis的有序集合实现大文件去重
2019/03/06 PHP
图片完美缩放
2006/09/07 Javascript
javascript 数组的方法集合
2008/06/05 Javascript
jquery提示效果实例分析
2014/11/25 Javascript
浅谈js的url解析函数封装
2016/06/28 Javascript
JavaScript制作简易计算器(不用eval)
2017/02/05 Javascript
Nodejs中Express 常用中间件 body-parser 实现解析
2017/05/22 NodeJs
js实现一个简单的MVVM框架示例
2018/01/15 Javascript
vue父组件点击触发子组件事件的实例讲解
2018/02/08 Javascript
解决webpack+Vue引入iView找不到字体文件的问题
2018/09/28 Javascript
Vue-CLI3.x 设置反向代理的方法
2018/12/06 Javascript
JS使用new操作符创建对象的方法分析
2019/05/30 Javascript
vue+导航锚点联动-滚动监听和点击平滑滚动跳转实例
2019/11/13 Javascript
[01:23:35]Ti4主赛事胜者组 DK vs EG 1
2014/07/19 DOTA
linux系统使用python监控apache服务器进程脚本分享
2014/01/15 Python
python机器学习之随机森林(七)
2018/03/26 Python
Python numpy 点数组去重的实例
2018/04/18 Python
Python实现图片识别加翻译功能
2019/12/26 Python
pytorch 获取tensor维度信息示例
2020/01/03 Python
TensorFlow命名空间和TensorBoard图节点实例
2020/01/23 Python
Softmax函数原理及Python实现过程解析
2020/05/22 Python
Python基于xlrd模块处理合并单元格
2020/07/28 Python
详解使用scrapy进行模拟登陆三种方式
2021/02/21 Python
兰蔻美国官网:Lancome美国
2017/04/25 全球购物
计算机专业推荐信范文
2013/11/20 职场文书
阳光体育活动方案
2014/02/16 职场文书
财务科长个人对照检查材料
2014/09/18 职场文书
公务员个人年终总结
2015/02/12 职场文书
运动会主持人开幕词
2016/03/04 职场文书
解读MySQL的客户端和服务端协议
2021/05/10 MySQL