CORS跨域资源共享
一、为什么需求跨域计划
1995年Netscape公司在浏览器中引进中了同源战略,最初其含义是A网页设置的cookie,B网页不能翻开,为了确保用户的信息安全,防止被歹意的网站盗取用户的数据。
这个是浏览器中十分重要的战略,后来基本上一切的浏览器都实现了同源战略。虽然确保了浏览器的安全,但是在实际运用中也约束了一些需求进行跨域的运用场景,例如单点登录,这时分就需求有完善的跨域计划。
二、什么是CORS
CORS是Cross-origin resource sharing,跨域资源共享,是一个W3C的标准,一个常用的跨域共享计划。
现在Ajax恳求只答应同源拜访,不答应跨域拜访,而CORS计划答应浏览器向跨源服务器发出XMLHttpRequest恳求,CORS需求浏览器和服务器一起配合进行支撑。
简略的理解,CORS计划完全由浏览器进行操作,用户无感,在建议恳求的时分判别是跨域的恳求会主动增加一些附加头信息,而后端的服务器识别并增加对这类恳求的支撑,CORS针对不同的恳求类型有不同的恳求方式,一是simple request,二是not-so-simple request。
契合以下两种状况的恳求是simple request
1、恳求的办法是以下三种办法之一。
- HEAD
- GET
- POST
2、HTTP header不超出以下几个字段
- Accept
- Accept-Language
- Content-Language
- Last-Event-ID
- Content-Type:只限于三个值application/x-www-form-urlencoded、multipart/form-data、text/plain
超出这两种状况的都归于not-so-simple-request。
三、simple request
针对simple request,在建议恳求今后,浏览器判别是跨域的恳求今后会主动在恳求header中增加Origin字段, 本次恳求来自哪个源,留意是否同源是根据“协议+域名+端口”三者来判别的。
服务端接受到恳求今后需求检查Origin字段的值判别归于哪个源,是否答应对于这个源的拜访恳求。假如答应恳求的话,那么呼应中的header会出现以下这几个字段:
Access-Control-Allow-Origin Access-Control-Allow-Credentials Access-Control-Allow-Credentials Content-Type
其间
Access-Control-Allow-Origin、Content-Type是有必要的字段,Access-Control-Allow-Origin字段阐明答应来自某个源的跨域恳求,它的值要么是恳求时Origin字段的值,要么是一个*(设置为*的状况下,无法跨域获取cookie),表明接受恣意域名的恳求。
Access-Control-Allow-Credentials字段可选,代表是否答应浏览器发送cookie,默认状况下不答应,若需求答应则设置为true,特别阐明,浏览器客户端建议XMLHttpRequest的时分需求同步设置withCredentials特点为true。
Access-Control-Expose-Headers归于可选字段,CORS恳求XMLHttpRequest对象的getResponseHeader办法只能获取到Cache-Control、Content-Language、Content-Type、Expires、Last-Modified、Pragma这几个字段,其他的header字段无法获取,若要获取其他字段,则将字段名设置在Access-Control-Expose-Headers字段中。
四、not-so-simple-request
针对not-so-simple-request,例如DELETE恳求,浏览器假如发现这种恳求,那么会先建议一个OPTIONS恳求,表明这个恳求是用来进行询问的,其间header中会有以下字段:
-
Origin
表明恳求来自哪个源。 -
Access-Control-Request-Method
希望查询是否支撑的HTTP办法,一般也便是客户端会建议的办法,例如上面提到的DELETE。 -
Access-Control-Request-Headers
CORS恳求额外发送的header字段
当服务端收到这个OPTIONS恳求今后,假如不支撑跨域恳求,则不增加任何header信息,直接返回即可,假如支撑这个跨域恳求,则增加相应的header
Access-Control-Allow-Methods Access-Control-Allow-Headers Access-Control-Allow-Credentials Access-Control-Max-Age
-
Access-Control-Allow-Methods
服务器支撑的一切跨域恳求的办法,用逗号分隔。 -
Access-Control-Allow-Headers
跨域恳求一切支撑的恳求头字段信息,用逗号分隔。 -
Access-Control-Allow-Credentials
同simple request中的定义。 -
Access-Control-Max-Age
可选,表明本次OPTIONS恳求能够被浏览器缓存的时间。
我有话说: