cross origin resource share
简单的请求
有些请求不会触发CORS预检。这些在本文中被称为“简单请求”,尽管Fetch规范(它定义了CORS)不使用该术语。不会触发CORS预检的请求(所谓的“简单请求”)是满足以下所有条件的请求:
唯一允许的方法是:
- GET
- HEAD
- POST
CORS安全列表请求标头
除了由用户代理自动设置的标头(例如,Connection,User-Agent,或任何与所述抓取规格为“禁止的标题名称”定义名称其它标题的),其允许被手动设置仅标头是那些Fetch规范将其定义为“CORS安全列表请求标头”,它们是:
- Accept
- Accept-Language
- Content-Language
- Content-Type (但请注意下面的附加要求)
- Last-Event-ID
- DPR
- Downlink
- Save-Data
- Viewport-Width
- Width
Content-Type标题的唯一允许值是:
-
application/x-www-form-urlencoded
-
multipart/form-data
-
text/plain
没有事件侦听器XMLHttpRequestUpload在请求中使用的任何对象上注册。
ReadableStream请求中没有使用对象。
预先请求的请求
与上面讨论的“简单请求”不同,“preflighted”请求首先通过OPTIONS方法向另一个域上的资源发送HTTP请求,以确定实际请求是否安全发送。 跨站请求是这样预检的,因为它们可能会影响用户数据。
特别是,如果满足以下任一条件,则会请求一个请求:
如果请求使用以下任何一种方法:
- PUT
- DELETE
- CONNECT
- OPTIONS
- TRACE
- PATCH
如果,除了由用户代理自动设置的标头(例如,Connection,User-Agent,或任何与所述抓取规格为“禁止的标题名称”中定义的名称其它头的),该请求包括比其他任何头那些Fetch规范将其定义为“CORS安全列表请求标头”,参考上面
如果该Content-Type头具有如下的以外值:
- application/x-www-form-urlencoded
- multipart/form-data
- text/plain
如果XMLHttpRequestUpload在请求中使用的对象上注册了一个或多个事件侦听器。
或者如果ReadableStream请求中使用了对象。
预检响应
Access-Control-Max-Age给出以秒为单位的值, 这个响应头表示 preflight request(预检请求)的返回结果(即 Access-Control-Allow-Methods 和Access-Control-Allow-Headers 提供的信息) 可以被缓存多久。 Access-Control-Max-Age:
返回结果可以被缓存的最长时间(秒)。 delta-seconds: 在 Firefox 中,上限是24小时 (即 86400 秒)。 在 Chromium v76 之前, 上限是 10 分钟(即 600 秒)。 从 Chromium v76 开始,上限是 2 小时(即 7200 秒)。 Chromium 同时规定了一个默认值 5 秒。 如果值为 -1,表示禁用缓存,则每次请求前都需要使用 OPTIONS 预检请求。