位置: 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)

  • 电脑版为正文怎么设置分栏(电脑上正文格式怎么做)

    电脑版为正文怎么设置分栏(电脑上正文格式怎么做)

  • 苹果手机共享位置后为什么看不见对方位置(苹果手机共享位置怎么关闭)

    苹果手机共享位置后为什么看不见对方位置(苹果手机共享位置怎么关闭)

  • 抖音每日点赞是有限制吗(抖音每日点赞有限制吗)

    抖音每日点赞是有限制吗(抖音每日点赞有限制吗)

  • 水平标出现在word文档工作区的是(水平标出现在word)

    水平标出现在word文档工作区的是(水平标出现在word)

  • 耐特指纹锁怎么录指纹(耐特指纹锁怎么改密码)

    耐特指纹锁怎么录指纹(耐特指纹锁怎么改密码)

  • mini5电池容量多少毫安(mini5电池耐用吗)

    mini5电池容量多少毫安(mini5电池耐用吗)

  • 快手删评论影响热度吗(快手删评论影响浏览量吗)

    快手删评论影响热度吗(快手删评论影响浏览量吗)

  • iphone11pro是6g运存吗(iphone11pro到底是4g还是6g)

    iphone11pro是6g运存吗(iphone11pro到底是4g还是6g)

  • 不用ps怎么改照片大小(不用ps怎么改照片像素大小)

    不用ps怎么改照片大小(不用ps怎么改照片像素大小)

  • 怎么快速复制第一行到最后一行(怎么快速复制第一行到第二行)

    怎么快速复制第一行到最后一行(怎么快速复制第一行到第二行)

  • 表格筛选不了怎么回事(表格筛选不了怎么解除保护)

    表格筛选不了怎么回事(表格筛选不了怎么解除保护)

  • 荣耀9x升降摄像头怎么用(荣耀9x升降摄像头卡住了)

    荣耀9x升降摄像头怎么用(荣耀9x升降摄像头卡住了)

  • 手机如何找回wifi密码(手机如何找回wifi名称)

    手机如何找回wifi密码(手机如何找回wifi名称)

  • 华为mate30发布时间(华为mate30手机发布价格)

    华为mate30发布时间(华为mate30手机发布价格)

  • 好玩吧怎么注销账户(好玩吧解除绑定算注销么)

    好玩吧怎么注销账户(好玩吧解除绑定算注销么)

  • 小米9pro5g支持4g吗(小米九pro支持五g吗)

    小米9pro5g支持4g吗(小米九pro支持五g吗)

  • 快手pk怎么去对面直播间(快手pk怎么结束pk)

    快手pk怎么去对面直播间(快手pk怎么结束pk)

  • 反片打印是双面打印吗(反片打印是双面的吗)

    反片打印是双面打印吗(反片打印是双面的吗)

  • vivo计算器怎么横过来(vivo计算器怎么算分数)

    vivo计算器怎么横过来(vivo计算器怎么算分数)

  • 华为荣耀20i有没有红外遥控(华为荣耀20i有没有红外线功能)

    华为荣耀20i有没有红外遥控(华为荣耀20i有没有红外线功能)

  • 为什么朋友圈点赞不显示(为什么朋友圈点不了赞)

    为什么朋友圈点赞不显示(为什么朋友圈点不了赞)

  • 高翔ORB-SLAM2稠密建图编译(添加实时彩色点云地图+保存点云地图)

    高翔ORB-SLAM2稠密建图编译(添加实时彩色点云地图+保存点云地图)

  • mtr命令  网络诊断(网络命令traceroute)

    mtr命令 网络诊断(网络命令traceroute)

  • 个人购买二手房贷款能贷多少
  • 留存收益资本成本率计算公式
  • 已出库未开票未收款会计分录
  • 个体户银行开户是开公户还是私户
  • 关于年底双薪和分红问题的处理
  • 收到投资款怎么做记账凭证
  • 全资子公司的利润有多少
  • 海关未抵扣证明
  • 增值税电子发票怎么下载
  • 退税显示未完成怎么处理
  • 营改增后一般纳税人动产租赁税率
  • 增值税返还收入冲减进项税
  • 资产负债率高说明长期偿债能力强吗
  • 收到赞助费要交税吗
  • 企业内部领用产品会计处理
  • 小企业会计准则会计科目表
  • 金税盘申请电子发票成功后怎样手工导入
  • 一个产品要有什么认证
  • php psr2
  • 城建税会计分录怎么写
  • 电子钥匙续费应用在哪里
  • 高新企业研发费用会计分录
  • PHP选项代码
  • 房屋修理费用
  • 农产品核定扣除和计算抵扣的区别
  • 固定资产付款流程
  • 微信小程序分成比例
  • php实现购物车功能的方法
  • 鸟瞰画面
  • 职工福利费包括奖金吗
  • yii框架教程
  • 公司给员工购买商业保险报销哪些
  • node js 安装
  • 认识数据库思维导图
  • 【深度学习】详解 MoCo
  • 现金流量的折现值
  • 2022年最新苹果平板电脑
  • java8 (jdk 1.8) 新特性——Lambda
  • 配置windows update
  • dedecms插件
  • 水运企业会计核算办法
  • 变更法人代表是重大事项吗
  • 入库单入账税务会查吗
  • 资产处置收益的核算内容
  • 其他收益和其他综合收益区别
  • 本月留抵增值税
  • 体检入账的原始凭证是
  • 银行存款利息收入要交税吗
  • 企业支付的产品和物资的原始价格是采购成本中的
  • 应纳税额与应纳所得额
  • 建筑工程合同中社保基金保证金
  • 农行公户怎么给公户转账
  • 明细分类账的记账
  • mysql改表名语句
  • /wlan direct
  • linux ln命令 -s
  • bcdedit.exe
  • win7桌面图标无法拖到任务栏
  • win7记事本可以保存的格式
  • xp电脑桌面图片显示缩略图
  • linux 请求
  • 使用windows管理无线
  • 无线和网络飞行模式
  • javascript中有几种数据类型
  • ExtJS4如何给同一个formpanel不同的url
  • vue实现分页功能
  • 批处理设置文件夹添加user组权限
  • vue实战案例
  • 安卓编程视频教程
  • javascript语言基础
  • python连接MySQL数据库增删改查
  • jQuery dataTables与jQuery UI 对话框dialog的使用教程
  • javascript的push方法
  • 容积率大于0.5 房产原值怎样算
  • 土地闲置是否需要缴纳土地使用税
  • 缴纳个人所得税怎么计算
  • 有限责任公司自然人独资属于什么企业
  • 八戒财税主要做什么
  • 土地增值税分期清算条件?
  • 两会热点有哪些呀?
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设