解决跨域的方法
1.在webpack的devserver的proxy配置"/api":{target:url}
2.浏览器配置:关闭浏览器的安全策略
3.JsonP 本质是利用script标签允许跨域
4.cors
cors需要浏览器和服务器同时支持,整个cors通信过程都是浏览器自动完成,不需要用户参与,关键实现是服务器,只要服务器实现了cors接口,就可以跨源通信
两种请求:
1.简单请求 满足以下两大条件就是简单请求:HEAD,GET,POST
头信息不超出以下几种字段:
1.accept
2.accept-language
3.content-language
4.last-Event-ID
5.content-type:'application/x-www-form-urlencoded'||'multipart/form-data'||'text/plain'
满足简单请求,浏览器直接发出cors请求,就是在头信息加一个origin字段,服务器根据这个值,决定是否同意这次请求。
如果origin的域名在许可范围内,服务器返回的响应,会多出几个头信息字段
Access-Control-Allow-Origin: http://api.bob.com
Access-Control-Allow-Credentials: true
Access-Control-Expose-Headers: FooBar
Content-Type: text/html; charset=utf-8
2.非简单请求
非简单请求是那种对服务器有特殊要求的请求,比如请求方法是PUT或DELETE,或者Content-Type字段的类型是application/json。
非简单请求的CORS请求,会在正式通信之前,增加一次HTTP查询请求,预检请求。
浏览器先询问服务器,当网页所在的的域名是否在服务器许可名单之中,以及可以使用哪些HTTP动词和头部信息,只有得到肯定的答复,
浏览器才会发出正式的XMLHttpRequest请求,否则报错。
浏览器如果发现这是一个非简单请求,就自动发送一个预检请求,要求服务器可以这样请求,预检用的是options,表示这个请求是用来询问的。
5.document.domain(同一基础域名之间的"跨域")
一个页面框架(iframe/frame)之间,是能够获取到彼此的window对象的,但是这个window拿不到方法和属性,但是如果两个域名的主域名和端口号一致的话, 可以设置他们的document.domain为一致域名,这样可以骗过浏览器的限制,达到跨子域的效果
前提条件:这两个域名必须属于同一个基础域名!而且所用的协议,端口都要一致,否则无法利用document.domain进行跨域
6.window.name
window对象有个name属性,该属性有个特征,在一个窗口的生命周期内,窗口载入的所有页面都是一个window.name的,每个页面对window.name都有读写的权限, window.name是持久存在一个窗口载入过的所有页面中的,并不会因为新页面的载入而重置