之前做了一个公司的内部管理体系,如今愿望经由过程在钉钉上开辟一个小运用检察相干数据,在此过程当中触及了HTTP的跨域要求的题目,在相识相干信息后,盘算基于CORS完成。关于CORS(跨域资源共享),见这篇文章。
CORS中,关于简朴要求,只需在服务器举行相干的字段考证后举行响应即可,主如果考证要求的泉源及要求的要领等是不是是服务器许可的。
而关于庞杂要求,则浏览器会先发送一个options要求到服务器举行考证,考证经由过程后,再发送用户的要求。再options要求中,服务器会返回许可的要求源、要求要领及头部字段等。
关于CORS在Laravel中的完成须要在项目中到场一个中间件Cors,
<?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)
{
header("Access-Control-Allow-Origin: *");
$headers = [
'Access-Control-Allow-Methods'=> 'POST, GET, OPTIONS, PUT, DELETE',
'Access-Control-Allow-Headers'=> 'Content-Type, X-Auth-Token, Origin'
];
$response = $next($request);
foreach($headers as $key => $value)
$response->header($key, $value);
return $response;
}
}
关于简朴要求,比方get要求,在路由中到场该中间件即可。
但关于庞杂要求,则处置惩罚不了。(依据文档,POST要求满足某些前提是才是庞杂要求,但不晓得为什么,我发出的POST要求都是庞杂要求,即浏览器首先会触发一次options要求,再提交客户的现实要求)。
关于只是采用与简朴要求雷同的要领,则关于庞杂要求没法准确响应。
以下是GET要求的要求-响应信息:
以下是POST要求的响应:
可见POST要求中,浏览器先举行了OPTIONS要求,但该要求的响应中,并没有GET响应中的
Access-Control-Allow-Headers:Content-Type, X-Auth-Token, Origin
Access-Control-Allow-Methods:POST, GET, OPTIONS, PUT, DELETE
Access-Control-Allow-Origin:*
等跨域掌握字段。
经由过程查询材料,Laravel关于OPTIONS要求会自动通例响应200。所以缺乏必要的头部信息。
所以,我经由过程在路由中特地到场一个处置惩罚options的路由
Route::options('cors/test',function(){
return response('ok')
->header('Access-Control-Allow-Methods','POST, GET, OPTIONS, PUT, DELETE')
->header('Access-Control-Allow-Headers','Content-Type, X-Auth-Token, Origin');
})->middleware('cors');
即保证了OPTIONS响应了必要的头部信息。
但该要领须要封闭Laravel中响应路由的CSRF功用,详细在AppHttpMiddlewareVerifyCsrfToken增加
protected $except = [
'cors/*'
];
虽然处理了题目,但关于个中的许多细节照样不相识,须要进一步进修。