Laravel开启跨域请求的方法
项目中用到了接口,外部调用的时候老是请求不到,本地请求却没问题,查了下说是因为跨域的问题。
根据网上所说解决方法如下:
1、建立中间件Cors.php
命令:phpartisanmake:middlewareCors
在/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文件内容如下:
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请求方式发送一个预请求(preflightrequest),从而获取知服务器端对跨源请求所支持HTTP方法。在确认服务器允许跨源请求的情况下,以实际的HTTP请求方法发送那个真正的请求。服务器端也可以通知客户端,是不是需要随同请求一起发送信用信息(包括Cookies和HTTP认证相关数据)。
跨源共享标准需要浏览器和服务端共同配合才能完成,目前浏览器厂商已经可以将请求部分自动完成,所以跨源资源访问的重点还是在于服务器端。
下面列出一些标准中可用的响应头和请求头。
ResponseHeader
Access-Control-Allow-Origin:指明哪些请求源被允许访问资源,值可以为“*”,”null”,或者单个源地址。
Access-Control-Allow-Credentials:指明当请求中省略creadentials标识时响应是否暴露。对于预请求来说,它表明实际的请求中可以包含用户凭证。
Access-Control-Expose-Headers:指明哪些头信息可以安全的暴露给CORSAPI规范的API。
Access-Control-Max-Age:指明预请求可以在预请求缓存中存放多久。
Access-Control-Allow-Methods:对于预请求来说,哪些请求方式可以用于实际的请求。
Access-Control-Allow-Headers:对于预请求来说,指明了哪些头信息可以用于实际的请求中。
Origin:指明预请求或者跨域请求的来源。
Access-Control-Request-Method:对于预请求来说,指明哪些预请求中的请求方式可以被用在实际的请求中。
Access-Control-Request-Headers:指明预请求中的哪些头信息可以用于实际的请求中。
RequestHeader
Origin:表明发送请求或预请求的来源。
Access-Control-Request-Method:在发送预请求时带该请求头,表明实际的请求将使用的请求方式。
Access-Control-Request-Headers:在发送预请求时带有该请求头,表明实际的请求将携带的请求头。
Author:leedaning
以上这篇Laravel开启跨域请求的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。