通过XHR实现Ajax通信的一个主要限制就是跨域安全策略。CORS(Cross Origin Resource Sharing,跨域资源共享)定义了在必须访问跨域资源时,浏览器与服务器如何沟通。
cors,把请求分为2种
- 简单请求(simple request)
- 非简单请求 (preflight request),请求方法是OPTIONS
那区分二者的标准是什么? 如下:
- 请求的方法只能是GET, POST, HEAD的一种
- 请求的header的只能是Accept,Accept-Language, Content-Language,Content-Type这些字段,不能超出这些字段
- 对于请求的header的Content-Type字段,只能是以下值
text/plain
multipart/form-data
application/x-www-form-urlencoded
都满足以上条件的就是简单请求,否则就是非简单请求。
比如我们经常使用的Content-Type:application/json; charset=utf-8,这个请求就是非简单请求
作者:答案cp3
链接:https://juejin.cn/post/7028169618405457956
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
IE对CORS的实现
通过XDR实现,XDR与XHR的区别:
- 不携带cookie
- 只能设置请求头部信息中的Content-Type字段
- 不能访问响应头部信息
- 只支持Get和Post请求
其他浏览器对CORS的实现
通过跨域XHR实现,限制如下:
- 不能使用setRequestHeader()设置自定义头部
- 不能发送和接受cookie
- 调用getAllResponseHeaders()方法时总是返回空
预检请求(Preflighted Requests)
一个 CORS 预检请求是用于检查服务器是否支持 CORS 即跨域资源共享。支持开发人员使用自定义的头部、GET或POST之外的方法,以及不同类型的主体内容。
这种请求使用OPTION方法发送下列头部信息
- Origin:与简单请求相同
- Access-Control-Request-Method:请求自身使用的方法
- Access-Control-Request-Headers:自定义的头部信息,多个头部信息用逗号隔开。
如果预检请求通过了,在一定时间内重复请求是不用再次发起预检请求。