前端关于 iframe 跨域的解决方案

286 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第18天,点击查看活动详情

在前端经常遇到跨域问题,在Vue项目中常用Proxy来解决跨域,在不使用框架的页面中,有时会使用iframe来嵌套另一个网站链接。但是由于网站的限制,导致无法通过这种形式访问。

image.png

于是便有了如下解决方案:

解决方案

在页面中嵌入了 iframe ,通过js 代码设置其访问路径,并在连接后面拼接encodeURI(text),即可嵌入成功。

<!doctype html>
<html>
<head>
  <meta charset="utf-8">
  <title>iframe跨域</title>
</head>

<body>
<iframe id="frame" src="###"></iframe>
<ul id="ct">
  <li>这里是内容1</li>
  <li>这里是内容2</li>
</ul>
<script>
  window.onload = function(){
    // var text = document.getElementById('ct').innerHTML;
    var text = "<li>这里是内容</li>";
    document.getElementById('frame').src="https://www.test.com/"+encodeURI(text);
  }
</script>
</body>
</html>

encodeURI

URI:通用资源标识符(UniformResourceIdentifier)

encodeURI() 函数可把字符串作为 URI 进行编码

执行如下代码:

image.png

运行结果:

image.png

  • encodeURIComponent()也是Javascript中对URL编码的函数 区别:encodeURI 中特殊含义的符号"; / ? : @ & = + $ , #“不进行编码,encodeURIComponent()可以进行编码

decodeURI

decodeURI() 函数可对 encodeURI() 函数编码过的 URI 进行解码

执行如下代码:

image.png

运行结果:

image.png

关于跨域

关于跨域首先要了解浏览器的同源策略。同源是指"协议+域名+端口"三者相同(两个不同的域名指向同一个ip地址也不是同源),它可以使页面不易受到XSS、CSFR等攻击。

分类大致如下,有些还可以进行细分:

  • JSONP跨域
  • 跨域资源共享(CORS)
  • nginx代理跨域
  • nodejs中间件代理跨域
  • iframe跨域
  • WebSocket协议跨域

跨域在原生js中、jquery、Vue、NodeJS 等有不同的实现方式,还有根据不同场景具体分析。