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 相关文章推荐
基于mysql的论坛(6)
Oct 09 PHP
解决GD中文乱码问题
Feb 14 PHP
PHP 上传文件的方法(类)
Jul 30 PHP
PHP生成UTF8文件的方法
May 15 PHP
php xml 入门学习资料
Jan 01 PHP
PHP设计模式之代理模式的深入解析
Jun 13 PHP
php设置session值和cookies的学习示例
Mar 21 PHP
php中常量DIRECTORY_SEPARATOR用法深入分析
Nov 14 PHP
php执行多个存储过程的方法【基于thinkPHP】
Nov 08 PHP
Laravel5.5新特性之友好报错以及展示详解
Aug 13 PHP
laravel如何开启跨域功能示例详解
Aug 31 PHP
PHP的mysqli_set_charset()函数讲解
Jan 23 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
PHP include_path设置技巧分享
2011/07/03 PHP
PHP中使用Memache作为进程锁的操作类分享
2015/03/30 PHP
PHP使用Pear发送邮件(Windows环境)
2016/01/05 PHP
CI框架中redis缓存相关操作文件示例代码
2016/05/17 PHP
PHP Filter过滤器全面解析
2016/08/09 PHP
php实现的二叉树遍历算法示例
2017/06/15 PHP
Laravel框架Request、Response及Session操作示例
2019/05/06 PHP
PHP的imageTtfText()函数深入详解
2021/03/03 PHP
JavaScript入门教程(7) History历史对象
2009/01/31 Javascript
javascript 表单规则集合对象
2009/07/21 Javascript
实现png图片和png背景透明(支持多浏览器)的方法
2009/09/08 Javascript
js下获取div中的数据的原理分析
2010/04/07 Javascript
详解JavaScript中的blink()方法的使用
2015/06/08 Javascript
AngularJS中的Directive实现延迟加载
2016/01/25 Javascript
JavaScript职责链模式概述
2016/09/17 Javascript
Angular2中Bootstrap界面库ng-bootstrap详解
2016/10/18 Javascript
原生js实现鼠标跟随效果
2017/02/28 Javascript
AngularJS+Bootstrap3多级导航菜单的实现代码
2017/08/16 Javascript
Angularjs 1.3 中的$parse实例代码
2017/09/14 Javascript
一个基于react的图片裁剪组件示例
2018/04/18 Javascript
Django+vue跨域问题解决的详细步骤
2019/01/20 Javascript
jQuery实现为table表格动态添加或删除tr功能示例
2019/02/19 jQuery
js实现二级联动简单实例
2020/01/11 Javascript
Vue使用鼠标在Canvas上绘制矩形
2020/12/24 Vue.js
[01:35]辉夜杯战队访谈宣传片—iG.V
2015/12/25 DOTA
Python __setattr__、 __getattr__、 __delattr__、__call__用法示例
2015/03/06 Python
使用PDB简单调试Python程序简明指南
2015/04/25 Python
Python解惑之True和False详解
2017/04/24 Python
Python实现时钟显示效果思路详解
2018/04/11 Python
Python对象中__del__方法起作用的条件详解
2018/11/01 Python
Python装饰器基础概念与用法详解
2018/12/22 Python
python SQLAlchemy 中的Engine详解
2019/07/04 Python
python 实现线程之间的通信示例
2020/02/14 Python
乌克兰巴士票购买网站:inBus
2021/03/12 全球购物
学雷锋日活动总结
2015/02/06 职场文书
管理者们如何制定2019年的工作计划?
2019/07/01 职场文书