什么是跨域
更新日期:
为什么会跨域?
要让两个不同源的客户端进行通信,就会遇到跨域的问题。同源策略是一个著名的安全策略,由 netscape 提出。现在所有支持 js 的浏览器都会使用这个安全策略。同源指域名、协议、端口号都相同。只要协议、域名、端口号一个不相同就会形成非同源的环境,如下。
常见的解决办法
- 在服务器端进行通信,因为服务器端不受跨域的限制。跨域的安全限制是对浏览器端来说的。
- 用 script 标签来解决,因为它的 src 属性是可以跨域的。
eg. 往常用 script 引入外部的 js
eg. 也可以用 js 动态创建 script 标签,并将其 append 到 body 里,就可以用这个 js 了。 - jsonp:它其实是一个非官方的协议,有特定的通信逻辑,但平时原生用的不多,因为 jQuery 本身就支持了 jsonp。
- $.ajax(),$.getJSON():jQuery 提供的现成函数来实现跨域。这两种方式(其实就是一种调用方式,需要传特定的参数)的原理是将 json 数据填充进回调函数,即创建一个回调函数,在远程服务器上调用这个函数并将 json 数据形式作为参数,完成回调。
- iFrame 实现跨域
- HTML5 的 postMessage 和 onmessage
其实 jsonp 里面也是创建了 script 标签,然后通过 js 回调的形式实现了跨域访问。而 jQuery 对 jsonp 也仅仅是支持,其核心也是 jsonp。所以,归根结底,这三种方式都是常见又经常被忽略的 script 标签。
自己整理
- js 中常用的6种跨域解决办法
里面详细谈了以下两点:
(1)相同主域 + iframe
(2)跨域 + iframe 用代理页 - HTML5 中的 postMessage 和 onmessage