[front-end] 前端跨域方法总结

本文介绍了浏览器同源策略的基本概念,并详细探讨了多种跨域访问的方法,包括JSONP、iframe结合document.domain、利用window.name特性的方法、HTML5 postMessage以及CORS等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

浏览器同源政策及其规避方法

jsonp
在页面上引入不同域的js脚本文件,请求页面返回一个带参数的执行函数
只能使用get

<script type="text/javascript">
  function doSth(data) {
    // 处理数据
  }
</script>.
<script src="https://example.com/data?callback=doSth"></script>

iframe + document.domain
在页面中定义一个隐藏iframe,在iframe中通过ajax访问同域的数据
通过document.domain设置为同样的父域名,通过win对象获取iframe中的数据访问
document.domain设置成自身或更高一级的父域,且主域必须相同。因此这种跨域只能在同主域的网页之间

<script>
  // 页面中
  document.domain = 'exam.com';
  var win = document.getElementById('iframe').contentWindow;
</script>
<script>
  // iframe中
  document.domain = 'exam.com';
</script>

window.name + iframe
通过window.name可以保存数据且不会在页面刷新过程中被消除的特性
请求页面将window.name设置为数据

<script type="text/javascript">
  function getData() {
    var iframe = document.getElementById('test');
    iframe.onload = function() {
      var data = iframe.contentWindow.name;
      // 处理数据
    }
    iframe.src = 'test.html'; // 设置成一个和主页面同源的页面就可以
  }
</script>
<iframe src="https://test.com" style="display:none;" onload="getData()"></iframe>

HTML5 postMessage
主要用于几个窗口之间的数据传递(用消息机制传递)
两个窗口能通信的前提是,一个窗口以iframe的形式存在于另一个窗口,或者一个窗口是从另一个窗口通过window.open()或者超链接的形式打开的(同样可以用window.opener获取源窗口)

<iframe id="iframe" src="b.com/index.html"></iframe>
<script type="text/javascript">
  window.onload = function() {
  var iframe = document.getElementById('iframe');
  var targetOrigin = 'http://b.com';
  iframe.contentWindow.postMessage('I was there!', targetOrigin);
};
</script>

<script type="text/javascript">
  window.addEventListener('message', function(event){
    // 通过origin属性判断消息来源地址
    if (event.origin == 'http://a.com') {
      alert(event.data);    // 弹出"I was there!"
      }
  }, false);
</script>

CORS(Cross-origin resource sharing)
CORS需要浏览器和服务器同时支持。IE10+
cors详解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值