什么情况造成跨域?
同源策略限制 不同源会造成跨域,以下任意一种情况不同,都是不同源:
同源:协议 域名 端口号全部相同 只要有一个不相同就是非同源策略
跨域解决方案有哪些
- 动态创建script
原理:动态创建一个script标签。利用script标签的src属性不受同源策略限制。因为所有的src属性和href属性都不受同源策略限制。可以请求第三方服务器数据内容。
步骤:
-
去创建一个script标签
-
script的src属性设置接口地址
-
接口参数,必须要带一个自定义函数名 要不然后台无法返回数据。
-
通过定义函数名去接收后台返回数据
//去创建一个script标签
var script = document.createElement("script");
//script的src属性设置接口地址 并带一个callback回调函数名称
script.src = "http://127.0.0.1:8888/index.php?callback=jsonpCallback";
//插入到页面
document.head.appendChild(script);
//通过定义函数名去接收后台返回数据function jsonpCallback(data){
//注意 jsonp返回的数据是json对象可以直接使用
//ajax 取得数据是json字符串需要转换成json对象才可以使用。
}
- CORS:跨域资源共享
服务器设置Access-Control-Allow-OriginHTTP响应头之后,浏览器将会允许跨域请求
限制:浏览器需要支持HTML5,可以支持POST,PUT等方法兼容ie9以上
需要后台设置
Access-Control-Allow-Origin: * //允许所有域名访问,或者
Access-Control-Allow-Origin: http://a.com //只允许所有域名访问
-
JSONP
原理:jsonp 技术就是利用了《script》 可以任意跨域的特点实现的。即dataType 为jsonp 的请求,实际是创建一个script 标签,通过该标签来实现访问,所以无论设置怎样的请求类型,从浏览器调试窗口可以看到,实际还是为GET 类型的。
-
postMessage
window.postMessage(message,targetOrigin) 方法是html5新引进的特性,可以使用它来向其它的window对象发送消息,无论这个window对象是属于同源或不同源,目前IE8+、FireFox、Chrome、Opera等浏览器都已经支持window.postMessage方法。 -
window.name + iframe
window对象有个name属性,该属性有个特征:即在一个窗口(window)的生命周期内,窗口载入的所有的页面都是共享一个window.name的,每个页面对window.name都有读写的权限。(window.name的值只能是字符串的形式,这个字符串的大小最大能允许2M左右甚至更大的一个容量,具体取决于不同的浏览器,一般够用了。)
-
document.domain + iframe
只有在主域相同的时候才能使用该方法