美文网首页
26.6、6种跨域获取数据的方法

26.6、6种跨域获取数据的方法

作者: 一土二月鸟 | 来源:发表于2020-07-25 09:43 被阅读0次

这个整理的更好: https://blog.51cto.com/u_14115828/3733252

前奏

  • 同源的iframe之间,可以通过window的属性进行传值。
    • 如果页面A中,包含iframe页面B,A通过iframeB.contentWindow可以获取B页面window的属性值。
    • 页面B可以通过window.parent获取A页面的window的属性值。
// ps 做此测试,需要将页面放置服务器,浏览器直接打开本地文件会报跨域错误
// 本地安装npm后,可在页面所在文件夹通过npx httpserver命令启动本地服务器
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
  </head>
  <body>
    我是页面A
    <iframe src="./B.html"></iframe>
    <script type="text/javascript">
      var iframeB = document.getElementsByTagName('iframe')[0];
      
      iframeB.onload = function () {  // 通过onload事件,等页面加载完了才可以获取被加载页面的属性
        console.log(iframeB.contentWindow.x); // b-x
      }
    </script>
  </body>
</html>

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8"/>
  </head>
  <body>
    我是页面B
    <script type="text/javascript">
      window.x = 'b-x';
    </script>
  </body>
</html>
  • iframe如果和所在页面不同源,可以正常载入页面,但是通过iframe.contentWindow或window.parent获取属性值时,会报跨域错误
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
  </head>
  <body>
    我是页面A
    <iframe src="http://localhost:8081/test1.html"></iframe>
    <script type="text/javascript">
      var iframeB = document.getElementsByTagName('iframe')[0];
      
      iframeB.onload = function () {
        console.log(iframeB.contentWindow); // 运行结果见下图
      }
    </script>
  </body>
</html>

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
  </head>
  <body>
    我是页面test1
    <script type="text/javascript">
      window.x = 'test1-x';
    </script>
  </body>
</html>
  • 不同源页面之间,在同一窗口发生跳转时,可以共享window.name属性。
    • 如页面A跳转到页面test1,但是没有打开新窗口,此时页面B将能获取到页面A中定义的window.name属性值。
    • ps:只有name属性值可以共享,其他自定义属性值无法共享。
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
  </head>
  <body>
    我是页面A <br />
    <a href="http://localhost:8081/test1.html" target="_self">跳到页面B</a>
    <script type="text/javascript">
      window.name = 'a-x';  
    </script>
  </body>
</html>

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
  </head>
  <body>
    我是页面test1
    <script type="text/javascript">
      console.log(window.name);
    </script>
  </body>
</html>

跨域 1 服务器中转

  • 适用于ajax请求
  • 服务器没有跨域的影响,因此可以通过此方法解决

跨域 2 iframe

  • 对于根域名相同、二级域名不同的网站,可以通过iframe载入目标网站,通过iframe.contentWindow获取到目标网站的ajax工具对象或目标网站的xhr对象(xhr方式未验证,理论上可行),然后再发起请求可以达到跨域的目的。
  • 前提需要将不同源网站的domain都赋值相同的一级域名。一级域名需要是当前网站的一级域名。

    扩展参考:https://blog.csdn.net/nlznlz/article/details/79506655

跨域 3

  • 想要获取不同源的iframe的contentWindow值,可以将iframe的页面进行跳转,跳转到和父页面相同源的网站,iframe跳转时,通过window.name进行传值。最终父页面可以获取到同源子页面的contentWindow的值。


跨域 4

  • 不同源页面通过postmessage和onmessage进行解决



跨域5

  • 通过iframe + loaction 将iframe页面的数据,通过url传递给同源页面。


    image.png

跨域6

  • 后端配置Access-Control-Allow-Origin:* 或指定网站

总结

3 + 4
JSONP
服务器:中转;配置Access;
iframe:iframe+domain(子域名跨域);iframe+window.name;iframe+url参数;iframe+postmessage/onmessage;

疑问2

  • 可能会涉及到跨域的场景 ajax请求、iframe通过contentWindow获取子页面的值
  • 解决跨域的方式
    1 通过服务器代理请求目标网站
    2 服务器设置access control allow origin
    3 jsonp
    4 ????

疑惑1

  • 如何去掉options
  • cache-control是默认的吗?
    -1. 服务器如何知晓返回的文件类型或语言和accept希望的不一致,从而返回406.
  1. 为什么刷新任何一个网站的时候,都没有304,而是200

  2. tcp是可靠的连接,是否可以基于tcp直接传输数据,不经过http等协议

  3. 四次挥手 如果是服务器发起 流程是怎样
    2.1 时间线的开始阶段是发生在TCP/IP断开连接之前发生的 我这样理解有问题吗?
    当HTML页面被下载下来后,就立马进入时间线流程了,但TCP/IP四次挥手是要等http请求结束后才会触发的 因此时间线的开始要早于四次挥手

  4. http一定是基于tcp?客户端cs架构一般用的什么协议?

  5. post请求时,会在tcp第三次握手时,先将请求头传输到服务器,服务器返回100后,客户端继续请求,为什么浏览器看不到100?

  6. 验证网速特别慢时,是否会等图片加载结束后,才执行onload
    how browser work
    下图为什么没有406

ajax相关

  • 封装ajax时,对于post请求为什么要设置xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); 如果不设置该请求头,默认也是可以正常访问的呀!

相关文章

  • 26.6、6种跨域获取数据的方法

    这个整理的更好: https://blog.51cto.com/u_14115828/3733252[https:...

  • 利用window.name+iframe跨域获取数据详解

    利用window.name+iframe跨域获取数据详解

  • 什么是跨域?跨域有几种实现形式:

    跨域指的是跨过同源策略,实现不同域之间进行数据交互的过程叫跨域。跨域的实现形式主要有JSONP方法、CORS方法、...

  • 跨域

    跨域指的是跨过同源策略,实现不同域之间进行数据交互的过程叫跨域。跨域的实现形式主要有JSONP方法、CORS方法、...

  • 如何解决跨域问题?

    理解跨域的概念:协议、域名、端口都相同才同域,否则都是跨域 出于安全考虑,服务器不允许ajax跨域获取数据,但是可...

  • JSONP是什么

    JSONP(JSON with padding),服务器与客户端跨源通信的常用方法,可以让网页从别的网域获取数据。...

  • Ajax 跨域请求

    如今大都要用到跨域的方法请求数据,网上的方法也是各式各样,这里我重点介绍两种不同的跨域形式。 一.跨域请求接口 主...

  • Ajax 跨域请求

    如今大都要用到跨域的方法请求数据,网上的方法也是各式各样,这里我重点介绍两种不同的跨域形式。 一.跨域请求接口 主...

  • 跨源网络访问

    链接:浏览器的同源策略链接:跨域资源共享链接:跨域共享数据的十种方法链接:前端跨域问题及其解决方案 广义的跨域:1...

  • javaweb 中的跨域请求

    方法一 、使用ajax进行跨域请求 方法json数据 配置拦截器用于允许指定的请求跨域 为含有/json/的url...

网友评论

      本文标题:26.6、6种跨域获取数据的方法

      本文链接:https://www.haomeiwen.com/subject/jmhplktx.html