常见几种跨域方式

什么情况造成跨域?

同源策略限制 不同源会造成跨域,以下任意一种情况不同,都是不同源:

同源:协议 域名 端口号全部相同 只要有一个不相同就是非同源策略
跨域解决方案有哪些

  1. 动态创建script

原理:动态创建一个script标签。利用script标签的src属性不受同源策略限制。因为所有的src属性和href属性都不受同源策略限制。可以请求第三方服务器数据内容。

步骤:

  1. 去创建一个script标签

  2. script的src属性设置接口地址

  3. 接口参数,必须要带一个自定义函数名 要不然后台无法返回数据。

  4. 通过定义函数名去接收后台返回数据

//去创建一个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对象才可以使用。
}
  1. CORS:跨域资源共享

服务器设置Access-Control-Allow-OriginHTTP响应头之后,浏览器将会允许跨域请求

限制:浏览器需要支持HTML5,可以支持POST,PUT等方法兼容ie9以上

需要后台设置
Access-Control-Allow-Origin: *              //允许所有域名访问,或者
Access-Control-Allow-Origin: http://a.com   //只允许所有域名访问
  1. JSONP

    原理:jsonp 技术就是利用了《script》 可以任意跨域的特点实现的。即dataType 为jsonp 的请求,实际是创建一个script 标签,通过该标签来实现访问,所以无论设置怎样的请求类型,从浏览器调试窗口可以看到,实际还是为GET 类型的。

  2. postMessage
    window.postMessage(message,targetOrigin) 方法是html5新引进的特性,可以使用它来向其它的window对象发送消息,无论这个window对象是属于同源或不同源,目前IE8+、FireFox、Chrome、Opera等浏览器都已经支持window.postMessage方法。

  3. window.name + iframe

    window对象有个name属性,该属性有个特征:即在一个窗口(window)的生命周期内,窗口载入的所有的页面都是共享一个window.name的,每个页面对window.name都有读写的权限。(window.name的值只能是字符串的形式,这个字符串的大小最大能允许2M左右甚至更大的一个容量,具体取决于不同的浏览器,一般够用了。)

  4. document.domain + iframe

    只有在主域相同的时候才能使用该方法

上一篇:Java Script


下一篇:同步加载、异步加载、延迟加载、预加载的区别