跨域相关问题 是最常见的基础面试题之一
出现原因:由于同源策略限制,同源策略是浏览器最核心也是最基本的安全功能,Web是构建在同源策略基础之上的。同源策略会阻止一个域的JS脚本和另一个域的内容进行交互。同源(指在同一个域)就是两个页面具有相同的协议(protocol)、主机(host)和端口号(port)。
什么是跨域:当一个请求的url的协议、域名、端口三者之间任意一个与当前页面url不同即为跨域
非同源限制
(1)无法读取非同源网页的Cookie、LocalStorage和IndexedDB
(2)无法接触非同源网页的DOM
(3)无法向非同源地址发送AJAX请求
跨域解决方法
(1)设置document.domain解决无法读取非同源的Cookie问题
浏览器通过document.domain属性来检查两个页面是否同源,因此将两个页面设置相同的document.domain,就可以共享Cookie(仅限主域相同,子域不同的跨域应用场景)
(2)跨文档通信API:window.postMessage()
调用postMessage方法实现父窗口 http://test1.com向子窗口http😕/test2.com发消息(子窗口同样可以使用该方法发送消息给父窗口)
主要使用于以下场景:

  • 页面和其打开的新窗口的数据传递
  • 多窗口之间消息的传递
  • 页面与嵌套的iframe消息传递
  • 上面三个场景的跨域数据传递
// 父窗口打开一个子窗口
var openWindow = window.open('http://test2.com', 'text');
// 父窗口向子窗口发消息(第一个参数代表发送的内容,第二个参数代表接收消息窗口的url)
openWindow.postMessage('Hello World!', 'http://test2.com');

调用message事件,监听对方发送的消息

window.addEventListener('message', function(e) {
  console.log(e.source);  // e.source 发送消息的窗口
  console.log(e.origin);  // e.origin 消息发向的网址
  console.log(e.data);  // e.data 发送的消息
}, false);

(3)JSONP
JSONP是服务器与客户端跨源通信的常用方法。最大特点就是简单实用,兼容性好(兼容低版本IE),缺点是只支持get请求,不支持post请求
网页通过添加一个