CORS的定义
cross-origin resource sharing——跨域资源共享
通俗地讲,CORS是W3C的新标准,允许浏览器向非同源的服务器发出HTTP请求,解决Ajax跨域请求。
CORS请求和非CORS请求的区别
所有的CORS请求都必须有一个固定的请求头字段:Origin。但是含有Origin头字段的请求不一定是CORS请求,因为有些浏览器在做同源请求的时候也会加上Origin字段,只不过Origin字段的值与Scheme(如,http)+Host相等。因此,判断CORS请求和非CORS请求的区别在于,请求头信息中Origin和Scheme+Host是否相等,相同则为同源请求;不相等则为CORS请求。
CORS分类
CORS请求分为两类,简单请求和非简单请求。在请求方式上,非简单请求比简单请求多出一步预检的过程。也就是说,非简单请求首先向服务器发出预检请求,得到许可之后再发出实际的请求。
简单请求
非简单请求
预检请求头信息
- Access-Control-Request-Method(一定含有)
- Method=OPTIONS
- Origin(一定含有)
- Access-Control-Request-Headers
实际请求头信息
没有什么特殊的地方
预检请求特殊应答头
- Access-Control-Allow-Origin(一定含有)
- Access-Control-Allow-Credentials
- Access-Control-Max-Age
- Access-Control-Allow-Methods(一定含有)
- Access-Control-Allow-Headers
实际请求特殊应答头
- Access-Control-Allow-Origin(一定含有)
- Access-Control-Allow-Credentials
- Access-Control-Max-Age
- Access-Control-Allow-Methods
- Access-Control-Allow-Headers
应答特殊头含义
- Access-Control-Allow-Origin
允许跨域访问的源 - Access-Control-Allow-Credentials
告诉客户端允许做用户确定(一种机制,服务端想知道是谁在请求自己的机制),cookies,HTTP authentication,client-side certificates。取值true/false - Access-Control-Expose-Headers
向外暴露的头信息,客户端可以通过get到的头字段 - Access-Control-Max-Age
这个字段是针对预请求的,并不是每次非简单的CORS请求都必须进行预请求检查的,第一次请求了,可以缓存起来,保存多长时间,设置即可,秒为单位。当然,客户端浏览器设置禁用缓存,那就另当别论了。 - Access-Control-Allow-Methods
允许访问的请求方法方法,预请求必须返回的头信息 - Access-Control-Allow-Headers
允许的头信息
注意:Access-Control-Allow-Origin的取值如果是“*”,则Access-Control-Allow-Credentials不起作用;也就是说,要使用Access-Control-Allow-Credentials,Access-Control-Allow-Origin必须是确定的
附录:
用户不能设置的头字段:
* Access-Control-Request-Headers(XMLHttpRequest2中增加的)
* Access-Control-Request-Method(XMLHttpRequest2中增加的)
* Connection (关闭除外)
* Content-Length
* Content-Transfer-Encoding
* Host
* Keep-Alive
* Origin
* Trailer
* Transfer-Encoding
* Upgrade
* Via