共计 1908 个字符,预计需要花费 5 分钟才能阅读完成。
简略申请与简单申请的概念
在 波及到 CORS 的申请 中,咱们会把申请分为简略申请和简单申请。满足以下条件的申请即为简略申请:
申请办法:GET、POST、HEAD
除了以下的申请头字段之外,没有自定义的申请头
Accept
Accept-Language
Content-Language
Content-Type
DPR
Downlink
Save-Data
Viewport-Width
Width
Content-Type 的值只有以下三种(Content-Type 个别是指在 post 申请中,get 申请中设置没有实际意义)
text/plain
multipart/form-data
application/x-www-form-urlencoded
非简略申请即为简单申请。简单申请咱们也能够称之为在理论进行申请之前,须要发动预检申请的申请。
预检申请(OPTIONS 申请)
为什么要发预检申请
咱们都晓得浏览器的同源策略,就是出于平安思考,浏览器会限度从脚本发动的跨域 HTTP 申请,像 XMLHttpRequest 和 Fetch 都遵循同源策略。
浏览器限度跨域申请个别有两种形式:
- 浏览器限度发动跨域申请
- 跨域申请能够失常发动,然而返回的后果被浏览器拦挡了
个别浏览器都是第二种形式限度跨域申请,那就是说申请已达到服务器,并有可能对数据库里的数据进行了操作,然而返回的后果被浏览器拦挡了,那么咱们就获取不到返回后果,这是一次失败的申请,然而可能对数据库里的数据产生了影响。
为了避免这种状况的产生,标准要求,对这种可能对服务器数据产生副作用的 HTTP 申请办法,浏览器必须先应用 OPTIONS 办法发动一个预检申请,从而获知服务器是否容许该跨域申请:如果容许,就发送带数据的实在申请;如果不容许,则阻止发送带数据的实在申请。
预检申请的特殊性
一、OPTIONS 不会携带申请参数和 cookie, 也不会对服务器数据产生副作用
二、Access-Control-Request-Method 和 Access-Control-Request-Headers
// 预检申请申请头
OPTIONS /resources/post-here/ HTTP/1.1
Host: bar.other
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Connection: keep-alive
Origin: http://foo.example
Access-Control-Request-Method: POST
Access-Control-Request-Headers: X-PINGOTHER, Content-Type
首部字段 Access-Control-Request-Method 告知服务器,理论申请将应用 POST 办法。首部字段 Access-Control-Request-Headers 告知服务器,理论申请将携带两个自定义申请首部字段:X-PINGOTHER 与 Content-Type。服务器据此决定,该理论申请是否被容许。
三、OPTIONS 申请响应头
响应头
Access-Control-Allow-Origin: http://foo.example
Access-Control-Allow-Methods: POST, GET, OPTIONS
Access-Control-Allow-Headers: X-PINGOTHER, Content-Type
Access-Control-Max-Age: 86400
首部字段 Access-Control-Allow-Methods 表明服务器容许客户端应用 POST,GET 和 OPTIONS 办法发动申请。
首部字段 Access-Control-Allow-Headers 表明服务器容许申请中携带字段 X -PINGOTHER 与 Content-Type。与 Access-Control-Allow-Methods 一样,Access-Control-Allow-Headers 的值为逗号宰割的列表。
最初,首部字段
Access-Control-Max-Age 表明该响应的无效工夫为 86400 秒,也就是 24 小时。在无效工夫内,浏览器毋庸为同一申请再次发动预检申请。请留神,浏览器本身保护了一个最大无效工夫,如果该首部字段的值超过了最大无效工夫,将不会失效。
预检申请实现之后,发送理论申请