浏览器何时会拒绝CORS请求?预检阶段还是响应返回后?
CORS拒绝的触发时机
CORS拒绝会在两个不同阶段触发,具体取决于请求的类型:
1. 预检请求阶段(针对非简单请求)
如果请求属于非简单请求(比如使用PUT/DELETE方法、携带自定义请求头、Content-Type为application/json等),浏览器会先发送一个OPTIONS类型的预检请求到目标服务器。
- 若服务器返回的预检响应缺少
Access-Control-Allow-Origin、Access-Control-Allow-Methods或Access-Control-Allow-Headers等必要头信息,或者这些头的取值与请求的实际参数不匹配,浏览器会直接阻断后续的实际请求,此时就会触发CORS拒绝,实际请求根本不会发送到服务器。
2. 实际请求响应返回后(针对简单请求)
对于简单请求(比如使用GET/POST方法、仅携带Accept、Accept-Language等允许的标准头、Content-Type为text/plain、multipart/form-data或application/x-www-form-urlencoded),浏览器会直接发送实际请求。
- 当服务器返回响应后,浏览器会检查响应头中的
Access-Control-Allow-Origin:如果这个头不存在,或者取值不包含当前页面的域名,浏览器就会触发CORS拒绝。此时请求已经到达服务器并得到响应,但浏览器会把响应拦截下来,不让前端代码读取。
需要明确的是:浏览器实施CORS的核心是保护前端代码的安全性,并非完全阻止请求发送——简单请求的请求实际已经发出,只是响应被拦截;非简单请求则会在预检失败时直接不发送实际请求。
内容的提问来源于stack exchange,提问作者Sravan
相关产品推荐
相关产品推荐

