资讯专栏INFORMATION COLUMN

关于跨域问题

livem / 1523人阅读

摘要:面试必考题吧,所以在这会详细介绍以下内容跨域产生的原因罗列最常用的解决方法分析各种方法原理罗列各种方法优缺点什么是跨域由于浏览器厂商对安全性的考虑,提出了浏览器的同源策略做为解决方案。

面试必考题吧,所以在这会详细介绍以下内容

跨域产生的原因

罗列最常用的解决方法

分析各种方法原理

罗列各种方法优缺点

什么是跨域

由于浏览器厂商对安全性的考虑,提出了浏览器的同源策略做为解决方案。它是一个用于隔离潜在恶意文件的重要安全机制。同源即协议域名端口三者一致。不同源即跨域。

如果没有同源策略会怎么样?

比如:当你访问了 饼夕夕的网站

// HTML
// 饼夕夕.com 内嵌 拼多多.com


// JS
// 由于没有同源策略的限制,钓鱼网站可以直接拿到别的网站的Dom
// 所以 饼夕夕.com 可以在 拼多多.com 输入账号密码处埋点
const $iframe = window.frames["pinduoduo"];
const $pwd = $iframe.document.getElementById("password");
console.log(`你的密码已泄露: ${$pwd}`)
解决方案(主流)

1. JSONP -> get请求跨域
原理:script和img等标签没有跨域限制
实现方案:(举例)

  // HTML 插入标签
  

  // JS
  function say(name, age) {
    console.log(`${name}, ${age} 岁`)
  }

  // 服务器返回response
  say("zmz", 18)

  // 那么客户端在script onload时会执行say方法

  // 结束

2. iframe+form实现post请求跨域
原理:利用form表单target属性,将post请求提交给隐藏的iframe,使页面不跳转

  var data = {
    name: "zmz",
    age: 18
  }
  var url = "http://localhost/say";

  var $iframe = document.createElement("iframe");
  $iframe.name = "iframePost";
  $iframe.style.display = "none";
  document.body.appendChild($iframe);
  
  $iframe.addEventListener("load", function(e) {
    console.log($iframe.contentWindow)
  })
  
  const form = document.createElement("form");
  const ipt = document.createElement("input");
  form.action = url;
  form.enctype = "application/json;"
  form.method = "post";

  // 最核心的一行代码
  // 在指定的iframe中执行form
  form.target = $iframe.name;

  for (var name in data) {
      ipt.name = name;
      ipt.value = data[name]; 
      form.appendChild(ipt.cloneNode());
  }
  form.style.display = "none";
  document.body.appendChild(form);
  form.submit();
  
  document.body.removeChild(form)

3. CORS 跨源资源共享
原理:新版XMLHttpRequest(ajax2.0)特性,服务器白名单
服务器端设置response.setHeader("Access-Control-Allow-xxx...

附:ajax2.0新特性

可以设置HTTP请求的时限xhr.timeout

可以使用FormData对象管理表单数据

可以上传文件 >> 同上

可以请求不同域名下的数据(跨域请求)

可以获取服务器端的二进制数据xhr.responseType = "blob"

可以获得数据传输的进度信息 xhr.upload.process

CORS分类

简单请求(自行搜索)

在请求头信息中指定Origin

非简单请求

会发送预检请求(options),返回状态码204

5. 代理
原理:服务器之间没有跨域限制
具体实现:

  // Nginx配置
  server{
    # 监听9099端口
    listen 9099;
    # 域名是localhost
    server_name localhost;
    # 匹配到都转发到http://localhost:9871 
    location ^~ /api {
        proxy_pass http://localhost:9871;
    }    
}

5. postMessage
原理:postMessage可以处理各种浏览器窗口之间的通信问题。
具体实现:

  // 发送方
  window.frames["crossDomainIframe"]
  iframe.postMessage("我想要数据", "http://localhost:8088")

  window.addEventListener("message", function () {
    if (e.origin === "http://localhost:2333") {
      console.log("收到", e.data)
    }
  }

  // 接收方
  window.addEventListener("message", (e) => {
    if (e.origin === "http://localhost:8088") {
      console.log(e.data)
      e.source.postMessage("给,你要的数据", e.origin);
    }
  })

6. WebSocket
原理:新协议(socket)
实现方案:类似postMessage
附:

socket.io框架能解决兼容性问题

各种方式对比

JSONP和iframe+from兼容性很好

但是错误处理和RESTful接口统一是个问题

CORS最简单粗暴

9102年了。微软都不维护Win7了。

代理

肯定会慢一丢丢咯,而且要找运维配

postMessage

处理窗口间通信,- -。不嫌麻烦可以用来跨域

WebSocket

处理长连接,附带跨域

End
文章分享同步于: https://github.com/zhongmeizh...

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/54747.html

相关文章

  • 20K前端大佬面试(关于如何回答ajax跨域问题)

    摘要:在接触前端开发起,跨域这个词就一直以很高的频率在我们学习工作中重复出现,最近在工作中遇到了跨域的相关问题,这里我把它总结记录一下。 在接触前端开发起,跨域这个词就一直以很高的频率在我们学习工作中重复出现,最近在工作中遇到了跨域的相关问题,这里我把它总结记录一下。关于跨域,有N种类型,现在我只专注于ajax请求跨域(ajax跨域只是属于浏览器同源策略中的一部分,其它的这里不做介绍),内容...

    Yangyang 评论0 收藏0
  • 20K前端大佬面试(关于如何回答ajax跨域问题)

    摘要:在接触前端开发起,跨域这个词就一直以很高的频率在我们学习工作中重复出现,最近在工作中遇到了跨域的相关问题,这里我把它总结记录一下。 在接触前端开发起,跨域这个词就一直以很高的频率在我们学习工作中重复出现,最近在工作中遇到了跨域的相关问题,这里我把它总结记录一下。关于跨域,有N种类型,现在我只专注于ajax请求跨域(ajax跨域只是属于浏览器同源策略中的一部分,其它的这里不做介绍),内容...

    stackfing 评论0 收藏0
  • 关于vue-resource在dev环境下跨域问题的解决方法

    摘要:跨域问题相信跨域问题是每个前端在请求中都会遇到的问题因为浏览器的同源策略的限制所以是不支持跨域的当然当后台在没有完成搭建的时候这时候我们需要使用到模拟数据的时候这时候很多的就会出现跨域问题在中当然这个问题也不例外如下所以在此我也就整理出了 跨域问题 相信跨域问题是每个前端在ajax请求中都会遇到的问题,因为浏览器的同源策略的限制,所以ajax是不支持跨域的,当然当后台在没有完成搭建的...

    timger 评论0 收藏0
  • 关于跨域

    摘要:服务端接收到请求后,通过该参数获得回调函数名,并将数据放在参数中将其返回收到结果后因为是标签,所以浏览器会当做是脚本进行运行,从而达到跨域获取数据的目的。 在使用Vue搭建的一个后端管理系统中,我使用axios请求本地的Node环境下的接口,但是请求失败,然后我错误信息是:showImg(https://segmentfault.com/img/remote/1460000018521...

    AlexTuan 评论0 收藏0
  • 关于跨域问题

    摘要:面试必考题吧,所以在这会详细介绍以下内容跨域产生的原因罗列最常用的解决方法分析各种方法原理罗列各种方法优缺点什么是跨域由于浏览器厂商对安全性的考虑,提出了浏览器的同源策略做为解决方案。 面试必考题吧,所以在这会详细介绍以下内容 跨域产生的原因 罗列最常用的解决方法 分析各种方法原理 罗列各种方法优缺点 什么是跨域 由于浏览器厂商对安全性的考虑,提出了浏览器的同源策略做为解决方案。它...

    ZoomQuiet 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<