一对一视频直播app开发,实现跨域的多种方式

一对一视频直播app开发,实现跨域的多种方式

一、document.domain + iframe跨域

此方案仅限主域相同,子域不同的跨域应用场景。实现原理:两个页面都通过js强制设置document.domain为基础主域,就实现了同域。

父窗口(http://www.demo.com/a.html))

<iframe id="iframe" src="http://child.demo.com/b.html"></iframe>
<script>
  document.domain = 'demo.com';
  var user = 'admin';
</script>

 

子窗口(http://child.demo.com/b.html))

<script>
  document.domain = 'demo.com';
  // 获取父窗口中变量
  alert('get js data from parent ---> ' + window.parent.user);
</script>

 

二、location.hash + iframe跨域

实现原理: a欲与b跨域相互通信,通过中间页c来实现。 三个页面,不同域之间利用iframe的location.hash传值,相同域之间直接js访问来通信。
具体实现:A域:a.html -> B域:b.html -> A域:c.html,a与b不同域只能通过hash值单向通信,b与c也不同域也只能单向通信,但c与a同域,所以c可通过parent.parent访问a页面所有对象。
实现原理: a欲与b跨域相互通信,通过中间页c来实现。 三个页面,不同域之间利用iframe的location.hash传值,相同域之间直接js访问来通信。
具体实现:A域:a.html -> B域:b.html -> A域:c.html,a与b不同域只能通过hash值单向通信,b与c也不同域也只能单向通信,但c与a同域,所以c可通过parent.parent访问a页面所有对象。

a.html:(http://www.demo1.com/a.html))

<iframe id="iframe" src="http://www.demo2.com/b.html" style="display:none;"></iframe>
<script>
  var iframe = document.getElementById('iframe');
 
  // 向b.html传hash值
  setTimeout(function() {
      iframe.src = iframe.src + '#user=admin';
  }, 1000);
  
  // 开放给同域c.html的回调方法
  function onCallback(res) {
      alert('data from c.html ---> ' + res);
  }
</script>

 

b.html:(http://www.demo2.com/b.html))

<iframe id="iframe" src="http://www.demo1.com/c.html" style="display:none;"></iframe>
<script>
  var iframe = document.getElementById('iframe');
 
  // 监听a.html传来的hash值,再传给c.html
  window.onhashchange = function () {
      iframe.src = iframe.src + location.hash;
  };
</script>

 

c.html:(http://www.demo1.com/c.html))

<script>
  // 监听b.html传来的hash值
  window.onhashchange = function () {
      // 再通过操作同域a.html的js回调,将结果传回
      window.parent.parent.onCallback('hello: ' + location.hash.replace('#user=', ''));
  };
</script>

 

三、window.name + iframe跨域

window.name属性的独特之处:name值在不同的页面(甚至不同域名)加载后依旧存在,并且可以支持非常长的 name 值(2MB)。

a.html:(http://www.demo1.com/a.html))

var proxy = function(url, callback) {
  var state = 0;
  var iframe = document.createElement('iframe');
 
  // 加载跨域页面
  iframe.src = url;
 
  // onload事件会触发2次,第1次加载跨域页,并留存数据于window.name
  iframe.onload = function() {
      if (state === 1) {
          // 第2次onload(同域proxy页)成功后,读取同域window.name中数据
          callback(iframe.contentWindow.name);
          destoryFrame();
      } else if (state === 0) {
          // 第1次onload(跨域页)成功后,切换到同域代理页面
          iframe.contentWindow.location = 'http://www.demo1.com/proxy.html';
          state = 1;
      }
  };
 
  document.body.appendChild(iframe);
 
  // 获取数据以后销毁这个iframe,释放内存;这也保证了安全(不被其他域frame js访问)
  function destoryFrame() {
      iframe.contentWindow.document.write('');
      iframe.contentWindow.close();
      document.body.removeChild(iframe);
  }
};
 
// 请求跨域b页面数据
proxy('http://www.demo2.com/b.html', function(data){
  alert(data);
});

 

proxy.html:(http://www.demo1.com/proxy…)

中间代理页,与a.html同域,内容为空即可。
b.html:(http://www.demo2.com/b.html))

<script>
  window.name = 'This is demo2 data!';
</script>

 

通过iframe的src属性由外域转向本地域,跨域数据即由iframe的window.name从外域传递到本地域。这个就巧妙地绕过了浏览器的跨域访问限制,但同时它又是安全操作。

以上就是一对一视频直播app开发,实现跨域的多种方式, 更多内容欢迎关注之后的文章

 

posted @ 2024-06-01 09:19  云豹科技-苏凌霄  阅读(3)  评论(0编辑  收藏  举报