关于前后端分离 跨域的问题之出现两次请求的问题(preflight预检)

由于浏览器的同源保护需要,第一次请求( 请求类型options)到服务器去验证 到不到响应就无法通过验证

所以需要对客户做一个正常响应(意思就是输出给浏览器,就是空内容)

第二次才是真正的请求

列子:

$origin = $_SERVER['HTTP_ORIGIN'] ?? '';
        $allowOrigin = Conf::get('app.cross_domain');
        if (!empty($origin) && !empty($allowOrigin)) {
            if (in_array($origin, $allowOrigin)) {
                $origin = $allowOrigin == "*" ? $allowOrigin : $origin;
                header('Access-Control-Allow-Origin: ' . $origin);
                header('Access-Control-Allow-Methods: GET, POST, PATCH, PUT, DELETE, OPTIONS');
                header("Access-Control-Allow-Credentials: true");//支持cookie跨域
                header("Access-Control-Allow-Headers: Authorization, Content-Type, If-Match, If-Modified-Since, If-None-Match, If-Unmodified-Since, X-CSRF-TOKEN, X-Requested-With");
                header('Access-Control-Max-Age: 1800');
                //判断是否是Options请求
                if ($request->isOptions()) {
                    return http_response_code(200);
                }
            }

        }

 一般 设置这个'Access-Control-Max-Age: 1800') 就能控制预检请求缓存在规定时间后才再次发起preflight预检请求(options)   1800表示隔30分钟才发起预检请求

posted @ 2022-11-18 01:47  闲时一点  阅读(296)  评论(0编辑  收藏  举报