CORS在浏览器中,基于某些安全原因,对JavaScript脚本的执行加入了同源(同协议、同域名、同端口)策略限制。当页面使用JavaScript发起请求时,浏览器会检测当前请求的URL是否与当前页面的URL同源。如果不是,一般会禁止执行请求以获得响应结果。CORS请求在请求头中添加Origin属性来标记当前请求页面的域,服务器检测请求头中的Origin。如果是可信请求源,可以添加Access-Control-Allow-Origin,内容是请求的来源,表示允许当前来源进行区块玉石请求,或者*,表示所有来源都是允许进行跨域请求。CORS标准将交叉预请求分为简单请求和非简单请求。当响应头满足以下条件时,认为是简单请求:请求方法为GET、POST、HEAD,请求头只包含以下属性Accept:客户端可接受的媒体类型Accept-Language:客户端可接受的语言clientContent-Lanuage:客户端请求内容的语言Last-Event-ID:最后一个事件IDContent-Type:客户端请求内容的MediaType,当且仅当MediaType为application/x-www-form-urlencoded,multipart/form-data,text/当三者之一为plain时,被认为是简单请求。浏览器发送时,会自动判断请求类型,并进行相应的处理。简单请求的发送和处理对于一个简单的请求,浏览器在发送时,会自动在请求头中添加Origin属性来表示请求的来源,值为请求中的协议、域名和端口信息请求页面的URL。ResponseheaderAccess-Control-Allow-Origin:必须返回,取值一般为请求的来源,但根据配置也可以是*,表示允许所有来源用逗号分隔。Access-Control-Request-Credentials:该属性可选,默认为false。用于表示是否允许浏览器在CORS请求中包含cookie信息。对于XMLHttpRequest,如果需要包含Cookie信息,还需要将withCredentials属性设置为true,这样请求中就会包含Cookie信息Access-Control-Expose-Headers:header属性列表,允许请求者的JS脚本通过Response获取,默认包括6个,基本属性有:Cache-Control、Content-Language、Content-Type、Expires、Last-Modified、Pragma。如果需要让其他属性可以访问CORS请求头,则需要通过响应头来设置属性列表。一旦请求者需要发送Cookie信息,响应头中的Access-Control-Allow-Origin不能是*,只能是请求者的来源。非简单请求的发送和处理当浏览器检测到当前CORS请求是一个非简单请求时,会先向服务器发送预检请求(preFlight)。预检请求通过后,将发送正式数据请求。预检请求预检请求是请求方法为OPTIONS的请求。它不携带任何请求问题,只携带一些与pre-CORS请求相关的元信息,例如CORS请求方法,包括哪些请求头。服务器端有pre-check请求中的信息来判断是否允许CROS请求。预检请求只有得到服务器肯定的回答,才能允许正式请求,否则请求会直接报错。预校验请求头Access-Control-Request-Method:请求头必须存在,表示本次CORS请求的请求方法。Access-Control-Request-Headers:表示除了简单请求中的请求头之外,CORS请求中包含的额外请求头属性列表。ResponseheaderAccess-Control-Allow-Origin:必须返回,取值一般为请求的来源,但根据配置也可以是*,表示允许所有来源用逗号分隔。Access-Control-Request-Methods:表示可以接受CORS请求的方法列表,用逗号隔开,多次回车可以避免多次预检。浏览器将缓存预检结果。Access-Control-Request-Headers:表示可接受的请求头列表,不包括基本请求头Access-Control-Request-Credentials简单请求头中:同简单请求Access-Control-Max-Age:可选属性.指示预检查结果的有限持续时间。浏览器会缓存预检结果。该属性表示缓存时间,以秒为单位。如果服务器不接受CORS请求,并且预检查响应不包含这些属性,浏览器将认为其无效。允许跨预请求。preflightrequest通过后,realrequest和simplerequest一样,包括Origin的请求头,response包括Access-Control-Allow-Origin。
