1、什么是跨域
是指浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器对JavaScript实施的安全限制。
同源:端口相同、协议相同、域名相同;三者有一个不同就是跨域
方法一:JSONP跨域
本质是利用了标签具有可跨域的特性;我们使用script标签请求地址,带上参数,参数值是我们在全局定义的一个函数;然后返回数据的时候,我们返回这个函数的调用,带上我们要传递回来的数据作为参数进行传递,这样浏览器会直接执行这个函数;这样就实现了跨域;
缺点:不支持post;只能是get
方案二、CORS跨域
服务端设置响应头信息,允许跨域
JSONP只支持GET请求,CORS支持所有类型的HTTP请求
浏览器将CORS请求分成两类:简单请求(simple request)和非简单请求(not-so-simple request)。
简单的请求:
(1)Access-Control-Allow-Origin
该字段是必须的。它的值要么是请求时Origin字段的值,要么是一个*,表示接受任意域名的请求。如果要发送Cookie,Access-Control-Allow-Origin就不能设为星号,必须指定明确的、与请求网页一致的域名
(2)Access-Control-Allow-Credentials
该字段可选。它的值是一个布尔值,表示是否允许发送Cookie。默认情况下,Cookie不包括在CORS请求之中。设为true,即表示服务器明确许可,Cookie可以包含在请求中,一起发给服务器。这个值也只能设为true,如果服务器不要浏览器发送Cookie,删除该字段即可。
(3)Access-Control-Expose-Headers
该字段可选。CORS请求时,XMLHttpRequest对象的getResponseHeader()方法只能拿到6个基本字段:Cache-Control、Content-Language、Content-Type、Expires、Last-Modified、Pragma。如果想拿到其他字段,就必须在Access-Control-Expose-Headers里面指定。上面的例子指定,getResponseHeader('FooBar')可以返回FooBar字段的值。
非简单请求 4.1 预检请求 非简单请求是那种对服务器有特殊要求的请求,比如请求方法是PUT或DELETE,或者Content-Type字段的类型是application/json。
非简单请求的CORS请求,会在正式通信之前,增加一次HTTP查询请求,称为"预检"请求(preflight)。
浏览器先询问服务器,当前网页所在的域名是否在服务器的许可名单之中,以及可以使用哪些HTTP动词和头信息字段。只有得到肯定答复,浏览器才会发出正式的XMLHttpRequest请求,否则就报错。
方案三、代理
方案四、postMessage
方案五、document.domin + iframe
这种方式在A页面通过iframe引入B页面,然后A、B页面都设置document.domain = 主域名;
这样我们在B页面可以通过window.parent.XXX来引入A页面的变量
方案六、window.name + iframe
(1)A页面:改变iframe的src 然后获取值
(2)B页面:设置window.name
(3)proxy.html页面 什么内容也没有
方案七、图片或者script标签跨域
方案八、socket.io
(1)客户端
(2)服务端