位置: IT常识 - 正文

前端跨域问题的解决方案Access to XMLHttpRequest at ‘http..’ from origin ‘null‘ has been blocked by CORS policy(前端跨域的方法)

编辑:rootadmin
前端跨域问题的解决方案Access to XMLHttpRequest at ‘http..’ from origin ‘null‘ has been blocked by CORS policy 前言:

推荐整理分享前端跨域问题的解决方案Access to XMLHttpRequest at ‘http..’ from origin ‘null‘ has been blocked by CORS policy(前端跨域的方法),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:前端跨域的几种解决方式,前端跨域的解决方法,前端跨域的几种方式,前端跨域的几种方式,前端跨域的解决方案,前端跨域的方法,前端跨域问题的解决方法,前端跨域问题的解决方法,内容如对您有帮助,希望把文章链接给更多的朋友!

在前端发出Ajax请求的时候,有时候会产生跨域问题,报错如下:

Access to XMLHttpRequest at 'http://127.0.0.1/api/post' from origin 'null' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

针对以上问题,本文提供两种解决方案,CORS中间件和JSONP方法。

在具体介绍解决方法之前,我们先明确以下前提条件:

1、这两个方法都需要通过后端修改接口情况,无法单独通过前端解决跨域问题。

2、什么是跨域?什么情况会出现跨域?

答:当浏览器发起Ajax请求时,如果所请求的url和当前的url的协议、域名、端口存在任意不同,就会产生跨域问题。比如我在这个地址file:///C:/Users/%E8%8A%.html,协议为file协议,如果请求http协议的文件,自然就会出现跨域问题。

3、当我们使用script、img、herf加载内容时不会出现跨域问题

好,接来下我们先给出出现问题的前 后端代码,看看这个时候对应前后端都做了什么事:

首先是前端:使用ajax发送get请求,请求地址为http://127.0.0.1/api/get,由于前端页面使用file格式打开,所以在请求http协议的本机地址是会产生跨域问题。

$("#btnGET").on("click", function () { $.ajax({ type: "GET", url: "http://127.0.0.1/api/get", success: function (res) { console.log(res); }, }); });

然后是后端:当请求的路由地址为/api/get的时候,返回对应的内容和query属性

app.get('/api/get',(req, res) => { // 通过 req.query 获取客户端通过查询字符串,发送到服务器的数据 const query = req.query; // 调用 res.send() 方法,向客户端响应处理的结果 res.send({ status: 0, // 0 表示处理成功,1 表示处理失败 msg: "GET 请求成功!", // 状态的描述 data: query, // 需要响应给客户端的数据 });})

OK,说完发生跨域问题的情况,我们接下来讲解决方法:

方法一:引入cors中间件

这个方法很简单只要在后端加入两行代码。(首先要先npm install cors 安装包),修改后的后端代码如下

const cors = require("cors");app.use(cors()); //使用cors中间件app.get('/api/get',(req, res) => { // 通过 req.query 获取客户端通过查询字符串,发送到服务器的数据 const query = req.query; // 调用 res.send() 方法,向客户端响应处理的结果 res.send({ status: 0, // 0 表示处理成功,1 表示处理失败 msg: "GET 请求成功!", // 状态的描述 data: query, // 需要响应给客户端的数据 });})

可以看到,引入了cors中间件之后,跨域问题可以得到解决,那么为什么解决,这么解决的原理是什么呢?让我们回到前面的报错内容:

 No 'Access-Control-Allow-Origin' header is present on the requested resource.意思就是说,所请求的资源没有Access-Control-Allow-Origin这个头,好的。那我们就把这个头给他安上,发现问题也可以解决,那么cors中间件是不是就是使用的这种方法呢?

app.get('/api/get',(req, res) => { // 通过 req.query 获取客户端通过查询字符串,发送到服务器的数据 res.header("Access-Control-Allow-Origin", "*"); 设置响应头,*表示任何地址都亦可以访问 const query = req.query; // 调用 res.send() 方法,向客户端响应处理的结果 res.send({ status: 0, // 0 表示处理成功,1 表示处理失败 msg: "GET 请求成功!", // 状态的描述 data: query, // 需要响应给客户端的数据 });})前端跨域问题的解决方案Access to XMLHttpRequest at ‘http..’ from origin ‘null‘ has been blocked by CORS policy(前端跨域的方法)

我们发现当我们使用了cors中间件之后,使用浏览器抓包,可以看到相应头里确实有了这个字段

 所以综上所述,cors中间件就是帮我们自动设置了响应头,从而解决跨域问题。

方法二:JSONP

简单来说,JSONP就是通过前端的script脚本从后端请求回来一段js代码并且执行从而获得数据,前端代码如下(视频截图下来的。。我懒得打字了)。。然后圈个重点JSONP只支持GET请求

来,我们解释一下:首先通过第一个script脚本注册一个函数f,那么这个函数自然就存在了,后面使用的脚本也能用f这个函数,这个道理和你用script引入一个jquery然后后面用 $ 开始一通操作是一样的道理。然后第二个script脚本访问一个跨域的资源,然后我们传入参数callback=f,这个参数有什么用呢?答:后端需要获取这个callback参数里面的值,然后把这个值(也就是f)拼接成一个函数然后返回回来给前端执行,对应后端代码如图。

前端代码:

 后端代码:可以看到这个funcname对应的就是那个f,然后拼接一下就变成了f('你好'),那么这个东西就返回给了前端。但是但是前端这个时候注册了一个f函数呀,所以就会执行这个f('你好'),那么前端的数据也就请求回来了。

到这里,两种方法都讲完了,下面补充一种让我懵逼了很久的jquery的jsonp解决方法

直接上代码:(后端代码不变,还是拼接一个函数回来执行)

$("#btnJSONP").on("click", function () { $.ajax({ type: "GET", url: "http://127.0.0.1/api/jsonp", dataType: "jsonp", jsonp: "callback", jsonpCallback: "f", success: function (res) { console.log(res); }, }); });

 打开控制台,可以看到jquery发送的这个请求其实和刚才是差不多的

 同样是拼接了一个callback参数给后端,后端返回js代码,此外呢,上面这段代码的jsonp参数和jsonpcallback参数书可以省略的,那样的话jquery会自动给你贴一个值

 

同时后端返回来的也就不再是那个f函数了。 

那么问题又来了,不是说ajax请求就会出现跨域问题,那为什么我这个用ajax发送jsonp请求就没有跨域呢?

答:我也不知道。然后就去查了一下jquery的文档。

 

所以大概是因为没有用到XMLhttprequest这个对象,所以并不算一个真正的ajax请求把。

好了吃饭去了~ 

本文链接地址:https://www.jiuchutong.com/zhishi/289031.html 转载请保留说明!

上一篇:达拉斯分水岭, 科罗拉多州西南部 (© Ronda Kimbrow/Shutterstock)(达拉斯位置)

下一篇:超详细纯前端导出excel并完成各种样式的修改(xlsx-style)(前端gui)

  • cpu温度过高怎么办电脑自动关机(cpu温度过高怎么办)(CPU温度过高怎么降温)

    cpu温度过高怎么办电脑自动关机(cpu温度过高怎么办)(CPU温度过高怎么降温)

  • 华为手机怎么截屏视频(华为手机怎么截取视频的一部分)

    华为手机怎么截屏视频(华为手机怎么截取视频的一部分)

  • 微信如何删除聊天记录(微信如何删除聊天记录不能恢复)

    微信如何删除聊天记录(微信如何删除聊天记录不能恢复)

  • 华为nova4手机电池容量是多少(华为nova4手机电池容量怎么看)

    华为nova4手机电池容量是多少(华为nova4手机电池容量怎么看)

  • erp系统规划包括哪些环节(erp系统计划)

    erp系统规划包括哪些环节(erp系统计划)

  • 手机蜂窝网络显示错误(手机蜂窝网络显示E 是怎么回事)

    手机蜂窝网络显示错误(手机蜂窝网络显示E 是怎么回事)

  • rf1是键盘上哪个键(lf1 rf1是什么键)

    rf1是键盘上哪个键(lf1 rf1是什么键)

  • 华为8a怎么分屏(华为8c怎么分屏)

    华为8a怎么分屏(华为8c怎么分屏)

  • qq小世界在哪里(QQ小世界在哪里看点赞的作品)

    qq小世界在哪里(QQ小世界在哪里看点赞的作品)

  • 淘宝评论视频待审核是什么意思(淘宝评论的视频怎么显示待审核)

    淘宝评论视频待审核是什么意思(淘宝评论的视频怎么显示待审核)

  • 微型word和word区别(微型word和word文档什么区别)

    微型word和word区别(微型word和word文档什么区别)

  • 三星s10是什么马达(三星s10是什么马达型号)

    三星s10是什么马达(三星s10是什么马达型号)

  • 云闪付为什么扫不了码(云闪付为什么扫不了微信二维码)

    云闪付为什么扫不了码(云闪付为什么扫不了微信二维码)

  • 怎么把微信好友隐藏(怎么把微信好友隐藏别人看不见)

    怎么把微信好友隐藏(怎么把微信好友隐藏别人看不见)

  • 旧手机号码忘了怎么查(旧手机号码忘了怎么查电信号码)

    旧手机号码忘了怎么查(旧手机号码忘了怎么查电信号码)

  • 苹果x怎么开启反向充电(苹果x怎么开启静音模式)

    苹果x怎么开启反向充电(苹果x怎么开启静音模式)

  • 荣耀9x录屏在哪(荣耀9x录屏在哪里)

    荣耀9x录屏在哪(荣耀9x录屏在哪里)

  • 新中付怎么用(新中付怎么刷信用卡)

    新中付怎么用(新中付怎么刷信用卡)

  • 不联网微信能记步数吗(不联网微信能记录信息吗)

    不联网微信能记步数吗(不联网微信能记录信息吗)

  • airpod2和airpod的区别(airpods2和airpods pro区别)

    airpod2和airpod的区别(airpods2和airpods pro区别)

  • 华为应用内支付怎么关(华为应用内支付怎么解除授权)

    华为应用内支付怎么关(华为应用内支付怎么解除授权)

  • iphone8夜景模式在哪(苹果8夜景模式)

    iphone8夜景模式在哪(苹果8夜景模式)

  • 滴滴对公和不对公区别(滴滴对公和不对公派单区别)

    滴滴对公和不对公区别(滴滴对公和不对公派单区别)

  • vivonex3厚度(vivonex3多长多宽)

    vivonex3厚度(vivonex3多长多宽)

  • 退出合种树能量返回吗(合种的树退出后能量怎么拿回来)

    退出合种树能量返回吗(合种的树退出后能量怎么拿回来)

  • 苹果手机热点打开教程(苹果手机热点打不开是灰色的)

    苹果手机热点打开教程(苹果手机热点打不开是灰色的)

  • 将yolov5中的PANet层改为BiFPN(yolov5输出result)

    将yolov5中的PANet层改为BiFPN(yolov5输出result)

  • 微信小程序之开发遇到 does not have a method “xxxx“ to handle event “tap“ 问题的解决方案【已解决】(微信小程序开挂方法)

    微信小程序之开发遇到 does not have a method “xxxx“ to handle event “tap“ 问题的解决方案【已解决】(微信小程序开挂方法)

  • 推荐国内免费使用chatGPT的工具(推荐国内免费使用的电影)

    推荐国内免费使用chatGPT的工具(推荐国内免费使用的电影)

  • 一般纳税人内账税金的处理
  • 土地使用税怎么征收标准
  • 固定资产出售如何申报增值税
  • 减免的企业所得税需要计入应交税费吗
  • 如何查询外经证缴了多少税
  • 补偿金需要缴纳个税吗?
  • 软件 折旧年限
  • 一个月作废发票多会有影响吗?
  • 工商局打印机读档案委托书
  • 代收货款的商品
  • 加油站企业规模大小怎么划分
  • 视同销售要确认收入吗?
  • 借款转资本公积怎么算税
  • 调整以前年度多计提的工资
  • 收资料费怎么入账科目
  • 劳务派遣简易征收备案
  • 利息收入汇算清缴
  • 2018年老项目应该如何交税?
  • 注册资本需要
  • 小规模纳税人设备税率
  • 定额发票使用年限规定
  • 公益捐款
  • 增值税申报表附表一填表说明
  • 固定资产大修理和更新改造的区别
  • 存货清查的账务处理的阐述
  • 出纳人员发现假章怎么办
  • 公司收到残联补助如何开票
  • 优先股分类为金融负债
  • 此应用无法在你的电脑上运行w11
  • Laravel5.5新特性之友好报错以及展示详解
  • el-input_inner
  • php常用语句
  • 深度学习实战10-数学公式识别-将图片转换为Latex(img2Latex)
  • css各种居中
  • echarts y轴设置
  • php array_fill
  • php remote_addr
  • php数据查询
  • 调用系统服务出错原因
  • 公司一季度报表
  • 其他综合收益在资产负债表中如何填列
  • 第6章 分支语句和逻辑运算符
  • 内部交易费用外部交易费用
  • 一般纳税人是怎么征收
  • 权责发生制和收付实现制例题
  • access调用sql
  • 免税所得包括哪些
  • 影响留存收益变动的选折题
  • 一般纳税人销售旧货税率
  • 出售可供出售金融资产
  • 违约金 专票
  • 广告费和业务宣传费
  • 专利转让费一般是多少
  • 产权转移书据印花税减免政策
  • 税前扣除的职工福利费怎么算
  • 仓库用托盘怎么入账
  • 员工办理健康证介绍信模板
  • 服务业差旅费是什么科目
  • 购买设备怎么开专票
  • win8系统安装软件在桌面找不到
  • xp怎么删除多余的操作系统
  • linux如何替换
  • 让xp系统自动修复软件
  • kpupgrader.exe是什么
  • windows 10 mobile--移动版
  • window10里的ie浏览器
  • w10系统音量图标不能用了
  • win10手写输入法怎么设置
  • django框架结构
  • android opengles2.0教程
  • Ver、Vol、Ctty命令的使用教程
  • ja开发
  • 监听state
  • jquery入口
  • string和stringbuffer创建后都可以修改
  • 如何查询纳税信用级别
  • 海南省地方税务局公告2017年第2号
  • 黑龙江电子税务局app手机
  • 上海社保基数对照表
  • 契税为什么要补贴
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设