首页 > 其他分享 >js -- 跨域问题

js -- 跨域问题

时间:2023-04-27 21:34:59浏览次数:47  
标签:跨域 script -- js callback document id 页面

js -- 跨域问题

 

 

前言

  出于浏览器同源策略的影响,浏览器会阻止一个域的 js 脚本和另一个域的内容进行交互,因此产生了跨域问题,该问题也经常在面试和开发中遇到,本文来总结一下相关知识点。

正文

  1、什么是同源策略

  因为浏览器出于安全考虑,存在同源策略,就是说如果协议、域名、端口号有一个不同就产生了跨域,不同域之间的资源是不能交互的,比如:Ajax 请求别的域的资源就会失败,无法读取别的域中网页的 Cookie 、LocalStorage 和 IndexedDB,无法获取别的域中网页中的 DOM 对象等。下面总结了跨域常见的解决方法。

  2、跨域解决方法

  (1)JSONP 解决跨域

  JSONP 是服务器与客户端跨源通信的常用方法。最大特点就是简单适用,兼容性好(兼容低版本IE),缺点是只支持get请求,不支持post请求。

核心思想:网页通过添加一个<script>元素,向服务器请求 JSON 数据,服务器收到请求后,将数据放在一个指定名字的回调函数的参数位置传回来。

复制代码
  <script type="text/javascript">
    // 创建jsonp 函数
    function jsonp(url, data, callback) {
      var id = "_" + "Json" + (new Date()).getTime();  //创建一个几乎唯一的id
      window[id] = function (result) {
        if (callback) {
          callback(result);
        }
        var getId = document.getElementById(id);  //移除Script标签和id
        getId.parentNode.removeChild(getId);
        window[getId] = null;  //调用函数后进行销毁
      }
      url = url.replace("callback=?", "callback=" + id);
      const script = document.createElement('script')
      script.src = url
      script.id = id
      script.async = true
      script.type = 'text/javascript'
      document.body.appendChild(script)
    }
    // 创建回调函数
    function dosomething(res) {
      console.log(res.data)
    }
    // 调用jsonp函数
    jsonp('http://test.com/api/getInfo?callback=?', dosomething)
  </script>
复制代码

  (2)document.domain 解决跨域

  浏览器通过 document.domain 属性来判断两个页面是否同源,因此可以设置相同的 document.domain 属性值来解决跨域,缺点该方法只限于主域相同,子域不同的跨域场景。

复制代码
    // a.html
    document.domain = "test.com"
    // b.html
    document.domain = "test.com"
复制代码

  (3)postMessage Api 解决跨域

  通常用于获取嵌入页面中的第三方数据,一个页面发送消息,另一个页面接收消息,比如通过 iframe 标签嵌入的父子页面之间的消息传值。

复制代码
    <!-- 父页面 -->
    <iframe src="child.html" frameborder="0" id="Iframe"></iframe>
    <script>
      // 监听子页面传递的值
      window.addEventListener('message', function (event) {
        
      })
      // 给子页面发消息
      document.getElementById('Iframe').contentWindow.postMessage(message, "*")
    </script>
    <!-- 子页面 -->
    <script>
      // 子页面给父页面发消息
       window.parent.postMessage("给父页面发消息", '*')
      //  监听父页面的消息
       window.addEventListener('message', function (event) {
      })
    </script>
复制代码

  (4)CORS 解决跨域

  该方式需要服务端和浏览器同时支持,浏览器会自动进行 CORS 通信,后端实现了 CORS 就实现了跨域,服务端需要设置 Access-Control-Allow-Origin 就可以开启 CORS ,该属性表示哪些域名可以访问资源,如果使用通配符则表示所有网站都可以访问。

  如果要实现带 Cookie 进行跨域请求,前端需要额外设置 withCredentials 为 true。

  (5)Nginx 反向代理

  该方法需要通过 Nginx 搭建中转服务器,用于转发请求。只需要在 nginx.config 中配置转发请求即可。

  (6)webpack-dev-server 设置本地代理

  该方式用于开发环境中,在webpack.config.js 中设置代理的本地服务器就可以,如下:

复制代码
devServer: {
        port: 8080,
        proxy: {
            "/api": {
              target: "http://192.168.25.20:8088" // 后端接口
            }
        }
    }
复制代码

写在最后

  以上就是本文的全部内容,希望给读者带来些许的帮助和进步,方便的话点个关注,小白的成长之路会持续更新一些工作中常见的问题和技术点。

 

标签:跨域,script,--,js,callback,document,id,页面
From: https://www.cnblogs.com/ministep/p/17360267.html

相关文章

  • Django笔记十六之aggregate聚合操作
    本文首发于公众号:Hunter后端原文链接:Django笔记十六之aggregate聚合操作这一篇笔记介绍一下关于聚合的操作,aggregate。常用的聚合操作比如有平均数,总数,最大值,最小值等等用到的model如下classAuthor(models.Model):name=models.CharField(max_length=100)ag......
  • 形状类
    #include<iostream>usingnamespacestd;classShape{public:virtualvoidgetArea(){}virtualvoidgetPerim(){}};classRectangle:publicShape{private:intl,w;public:voidsetnum(intchang,intkuan){chang=l;......
  • 【工具软件】Postman 设置登陆全局 token
    先设置Tests脚本constres=pm.response.json()pm.globals.set('token',res.data.token)使用......
  • 实现二叉树结点的新建、查找、修改
     如果需要新建结点(例如往二叉树里面插入结点时,可使用下面的函数(返回类型是一个指向node的指针)node*newNode(intv){nodeNode=newnode;//申请一个node类型变量的地址空间Node->data=v;//结点权值为vNode->lchild=Node->rchild=NULL;//初始状态下无左右孩子retur......
  • 学习-18
    1.jenkins自动拉取git仓库的代码(1)安装gitee插件到jenkins(2)修改任务项gitee默认不允许内网触发。----必须要配置内网穿透修改gitee远程仓库测试:修改idea中的代码并提交到gitee上,会自动触发jenkins---拉取--编译---打包2.完成自动化部署思考:我们的项目和jen......
  • 文件上传下载-SpringMvc
    进行文件上传时,表单需要做的准备:1.请求方式为POST:<formaction=”uploadServlet”method=”post”/>2.使用file的表单域:<inputtype=”file”name=”file”/>3.使用multipart/form-data的请求编码方式:<formaction=”uploadServlet”type=”file”name=”file”metho......
  • 2022-04-27:用go语言重写ffmpeg的remuxing.c示例。
    2022-04-27:用go语言重写ffmpeg的remuxing.c示例。答案2022-04-27:ffmpeg的remuxing.c是一个用于将多媒体文件从一种容器格式转换为另一种容器格式的命令行工具。它可以将音频、视频和字幕等元素从源文件中提取出来,并按照用户指定的方式重新封装到目标文件中。在本篇文章中,我将对ffmp......
  • [犯病记] 重新安装libc.so.6
    [犯病记]重新安装libc.so.6背景:有一天,我犯了个病,试图在一个机器上安装DOCA,然后安装程序就下了一堆库,把机器上的环境搞得一团糟,原来的DPDK也不能用了。DOCA的安装程序不仅重新安装了一大堆库,还更换了系统内核版本,修改了网卡配置,以及更换了网卡驱动(MLNX_OFED)。为此我不得不将上述......
  • CS50363内置MOS可升压16V,高效率升压DC-DC转换器
    CS50363E是一款采用CMOS工艺升压型开关稳压器,其主要包括一个参考电压源,一个振荡电路,一个误差放大器,一个相位补偿电路,通过PWM/PFM切换控制电路。CS50363E内置MOS的设计,只需极简的外围电路,可以最大限度的保证电源模块的可靠性以及避免电源模块设计的复杂化。CS50363E最高可提供16V恒......
  • css--实现一个文字少时居中,文字换行时居左的样式
    css--实现一个文字少时居中,文字换行时居左的样式 前言最近群里的小伙伴去面试,遇到这样一个问题,面试官问:"用css对一行文字进行布局,当文字不够换行的时候,这行文字要居中显示,当文字出现换行的时候,这行文字要靠左显示。",遇到这样的需求一下束手无策,后来查下资料,哦,原来这......