1、介绍
access系列字段是用于解决ajax跨域问题的一种方案,也称为CORS机制。
ajax是严格遵循同源策略的,既不能从另一个域读取数据,也不能发送数据到另一个域。当然,对于同源的来说,是可以请求和处理响应的,并携带登录凭证cookie。
注意:html元素对于浏览器不存在跨域问题。
而cors机制,并不能影响服务端是否处理跨域,只是用于解决浏览器对跨域请求的响应的处理。
2、Access-Control-Allow-Origin
响应标头指定了该响应的资源是否被允许与给定的来源(origin)共享。
Access-Control-Allow-Origin: *
Access-Control-Allow-Origin: <origin>
Access-Control-Allow-Origin: null
(1)*
对于不包含登录凭据的请求,即不要求cookie,服务器会以“*
”作为通配符,从而允许任意来源的请求代码都具有访问资源的权限。尝试使用通配符来响应包含凭据的请求会导致错误。
(2)指定
指定一个来源(只能指定一个)。如果服务器支持多个来源的客户端,其必须以与指定客户端匹配的来源来响应请求。如果浏览器没有接收到Access-Control-Allow-Origin字段,则会报错
注意:即使设置不允许跨域,但请求过程中已经携带数据,服务端接收,可能会进行处理
3、Access-Control-Allow-Credentials
用于告知浏览器是否允许资格证书,实际就是请求是否携带cookie的登录凭证。其值区分大小写,为true时,表示允许。
- 这时一般浏览器的ajax会设置请求头部字段withCredentials为true,浏览器会携带跨域的cookie
- 而且Access-Control-Allow-Origin不能设置为*,必须是指定的某个url
Access-Control-Allow-Credentials: true
4、withCredentials
这是一个请求头部字段,ajax进行设置
- true:在跨域请求时,浏览器会携带用户凭证
- false:默认值,在跨域请求时,不会携带用户凭证;返回的 response 里也会忽略 cookie
5、简单请求和复杂请求
简单请求:
- 请求方式只能是:GET、POST、HEAD
- HTTP请求头限制这几种字段(不得人为设置该集合之外的其他首部字段):
Accept、Accept-Language、Content-Language、Content-Type(需要注意额外的限制)、DPR、Downlink、Save-Data、Viewport-Width、Width - Content-type只能取:application/x-www-form-urlencoded、multipart/form-data、text/plain
- 请求中的任意XMLHttpRequestUpload 对象均没有注册任何事件监听器;XMLHttpRequestUpload 对象可以使用 XMLHttpRequest.upload 属性访问。
- 请求中没有使用 ReadableStream 对象。
复杂请求:除了简单请求之外的
6、预检
浏览器对复杂跨域请求在真正发送请求之前,会先进行一次预请求,就是参数为OPTIONS的第一次请求,他的作用是用于试探性的服务器响应是否正确,即是否能接受真正的请求,如果在options请求之后获取到的响应是拒绝性质的,例如500等http状态,那么它就会停止第二次的真正请求的访问。
7、Access-Control-Request-Method
在预检请求中,用于告知服务器在真正的请求中会采用哪种http方法,预检本身的请求总是OPTIONS方法。
Access-Control-Request-Method: POST
8、Access-Control-Request-Headers
在预检请求中,用于通知服务器在真正的请求中会采用哪些请求头。
Access-Control-Request-Headers: X-PINGOTHER, Content-Type
9、Access-Control-Allow-Methods
在预检中,服务器明确了客户端所要访问的资源允许使用的方法或方法列表。
Access-Control-Allow-Methods: POST, GET, OPTIONS
10、Access-Control-Allow-Headers
在预检请求中,用于告知浏览器将会在正式请求中允许的头部字段,对于简单头部字段不会列举,始终被支持
如果请求中含有 Access-Control-Request-Headers
字段,那么这个首部是必要的。
Access-Control-Allow-Headers: X-Custom-Header, Upgrade-Insecure-Requests
Access-Control-Allow-Headers: *
11、Access-Control-Expos-Headers
用于通知浏览器,列出了哪些首部可以作为响应的一部分暴露给外部。
默认情况下,只有七种 simple response headers(简单响应首部)可以暴露给外部:
Cache-Control
Content-Language
Content-Length
Content-Type
Expires
Last-Modified
Pragma
如果想要让客户端可以访问到其他的首部信息,可以将它们在 Access-Control-Expose-Headers
里面列出来。
Access-Control-Expose-Headers: Content-Length, X-Kuma-Revision
12、Access-Control-Max-Age
在预检请求中,用于通知浏览器返回结果(即 Access-Control-Allow-Methods
和Access-Control-Allow-Headers
提供的信息)可以被缓存多久
//单位为秒,值为-1表示禁用缓存,每次请求前都需要使用 OPTIONS 预检请求。而不同浏览器的最长允许缓存也有所差异
Access-Control-Max-Age: 600