CORS, 全称 Cross-Origin Resource Sharing, 翻译跨域资源共享. 是一种跨域调用的解决方案.
跨域资源共享标准新增了一组 HTTP 首部字段,允许服务器声明哪些源站有权限访问哪些资源。
在没有应用 CORS 的情况下, 在浏览器中调用跨域资源, 通过抓包可以看到, 其实请求是正确响应的了, 只不过浏览器 “拒绝” 使用了.
那要浏览器使用, 其实只要在响应头里加三行:
Access-Control-Allow-Origin: *
Access-Control-Allow-Method: GET,POST,PUT,PATCH,DELETE,OPTIONS
Access-Control-Allow-Credentials: true
(前阵子几个同事搞得挺大的最后也就是加这三个东西 🤪)
其中 Access-Control-Allow-Origin
是用于控制允许访问的域名, 设置为 *
明显是不行的, 并且服务端应该校验它的.
还是了解一下这几个到底是啥, 以及怎么用的.
跨域请求会被区分为两类: 简单请求与非简单请求 (应该是吧, MDN 上也叫 需预检的请求, ), 简单请求的定义是:
Content-Type
的值为 text/plain
, multipart/form-data
, application/x-www-form-urlencoed
如果不满足以上三个条件, 则请求不是简单请求.
如果请求不满足简单请求的条件, 请求就变成了需预检的请求. 所谓的预检, 就是向服务端以 OPTIONS 的方法调用目标 URI, 服务端只要返回一个不带 response body 的响应, 并且响应头中带有 Access-Control-Allow-Method
即可, 如果该响应头的值包含实际请求使用的方法, 例如想用 POST, 它响应了 POST, 那就没问题.
那么到这里, 就理清了 CORS 请求的两种情况:
那么列一下几个请求头和响应头中需要用到的几个字段:
注意, 当开启时,
Access-Control-Allow-Origin
不能为*
. 而当它的值非*
, 时, 响应头Vary
的值必须包含Origin
那么大概的流程就是:
如果是预检请求, 则处理步骤为:
如果是实际请求, 则处理步骤为:
可以看这个图: image.
那么理清了之后, 实现一个就很简单啦: cors-provider, Powered By RunnerLee.