跨域问题,纯后端,前端访问的时候可能跨域
问题描述:我有一个接口,偶尔跨域,偶尔不跨域,为什么会出现这个情况?
测试猜测:
1.请求没请求过的合同,会出现跨域,在请求可能不会
2.多次频繁的访问接口.也有一次可能不会出现跨域
注:不跨域后在请求就不会跨域了
App\Http\Kernel文件下的protected $middleware加了
\App\Http\Middleware\EnableCrossRequestMiddleware::class,
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Response;
/**
* 跨域中间件
*/
class EnableCrossRequestMiddleware
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
$response = $next($request);
$header=[
'Access-Control-Allow-Origin' => "*",//允许所有资源跨域
'Access-Control-Allow-Headers' => 'Origin, Content-Type, Cookie, Accept, Authorization',
'Access-Control-Allow-Methods' => 'GET, POST, PATCH, PUT, OPTIONS, DELETE, HEAD',//运行的请求方法
'Access-Control-Allow-Credentials' => 'true'//运行客户端携带证书式访问
];
if ($response instanceof Response) {
foreach ($header as $key => $value) {
$response->header($key, $value);
}
return $response;
}
foreach ($header as $key => $value) {
$response->headers->set($key, $value);
}
return $response;
}
}
跨域的时候,首次访问某个url,会发送
options
请求。浏览器根据options
返回的信息判断是否可以继续,然后才发送post
或get
请求。以后再访问这个url,如果上次options
验证了是可以跨域,那就不会再发送options
请求,直接post
或get
请求。中间件需要前置,判断请求类型,如果是
options
请求就直接设置headers
然后返回响应,结束本次请求。中间件后置的话可能会导致接口调用两次。