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

  • 微信电子证件可以支持哪些证件(微信电子证件可以更改吗)

    微信电子证件可以支持哪些证件(微信电子证件可以更改吗)

  • 荣耀10青春版华为机型叫什么(荣耀10青春版华为账号密码都忘记了怎么办)

    荣耀10青春版华为机型叫什么(荣耀10青春版华为账号密码都忘记了怎么办)

  • 正版win10密钥能用几次(window10正版密钥多少钱)

    正版win10密钥能用几次(window10正版密钥多少钱)

  • ipadpro弯曲被拒绝保修(ipadpro2020弯曲被拒绝保修)

    ipadpro弯曲被拒绝保修(ipadpro2020弯曲被拒绝保修)

  • 淘宝买东西店铺不存在了怎么办(淘宝买东西店铺不存在了可以退货吗)

    淘宝买东西店铺不存在了怎么办(淘宝买东西店铺不存在了可以退货吗)

  • 怎么删除别人发的朋友圈内容(怎么删除别人发朋友圈的视频文件)

    怎么删除别人发的朋友圈内容(怎么删除别人发朋友圈的视频文件)

  • 淘宝显示前方拥挤请稍后再试(淘宝显示前方拥堵稍后再试)

    淘宝显示前方拥挤请稍后再试(淘宝显示前方拥堵稍后再试)

  • 华为荣耀30与30s的区别(华为荣耀30与30i充电器区别)

    华为荣耀30与30s的区别(华为荣耀30与30i充电器区别)

  • 联想x250上市时间(联想x250配置参数)

    联想x250上市时间(联想x250配置参数)

  • 苹果11支持两个电信卡吗(苹果11支持两个微信吗)

    苹果11支持两个电信卡吗(苹果11支持两个微信吗)

  • 100kwh是多少度电(100kwh是多少度电多少钱)

    100kwh是多少度电(100kwh是多少度电多少钱)

  • 电脑卡需要换什么硬件(电脑卡需要换什么配件)

    电脑卡需要换什么硬件(电脑卡需要换什么配件)

  • ps铅笔怎么画直线(ps 铅笔画)

    ps铅笔怎么画直线(ps 铅笔画)

  • 华为手机怎样拍逆光照(华为手机怎样拍照更清晰)

    华为手机怎样拍逆光照(华为手机怎样拍照更清晰)

  • 淘宝开团什么意思(淘宝开团啥意思)

    淘宝开团什么意思(淘宝开团啥意思)

  • 苹果自带相册怎么加密(苹果自带相册怎么设置密码)

    苹果自带相册怎么加密(苹果自带相册怎么设置密码)

  • vivox27pro支持防水吗(vivox27防窥屏模式怎么设置)

    vivox27pro支持防水吗(vivox27防窥屏模式怎么设置)

  • 如何查询热力卡号(如何查询热力卡余额)

    如何查询热力卡号(如何查询热力卡余额)

  • 显示器vrb是什么意思(显示器vrb是什么功能?)

    显示器vrb是什么意思(显示器vrb是什么功能?)

  • 热点资讯在哪里关闭(热点资讯在哪里找)

    热点资讯在哪里关闭(热点资讯在哪里找)

  • 钉钉可以看到轨迹吗(钉钉可以看到轨迹记录吗)

    钉钉可以看到轨迹吗(钉钉可以看到轨迹记录吗)

  • iphonex原彩显示耗电吗(iphonex原彩显示在哪里)

    iphonex原彩显示耗电吗(iphonex原彩显示在哪里)

  • airpods一代和二代有什么区别(airpods一代和二代连接手机界面)

    airpods一代和二代有什么区别(airpods一代和二代连接手机界面)

  • 滴滴80分到90分要多少(滴滴出行分80分很难接单)

    滴滴80分到90分要多少(滴滴出行分80分很难接单)

  • createrepo命令  创建软件仓库及生成元数据(create_proc_entry)

    createrepo命令 创建软件仓库及生成元数据(create_proc_entry)

  • 固定资产变卖怎么开票
  • 教育行业主营业务内容
  • 百旺税控盘反写不了怎么回事
  • 发票金额太大怎么拆分数量,单价不变还是数量不变
  • 纳税申报的具体流程个体户
  • 房地产土地增值税的算法
  • 建安企业会计处理
  • 内部损益表
  • 垫付了医药费保险报销时怎么办
  • 利息收入增值税计税依据
  • 营改增通知及有关部门规定的税收优惠政策
  • 个体工商户餐饮业税率是多少
  • 税收分类编码选错了有事吗
  • 专用发票退回
  • 经营成本计算公式财务管理
  • 委托贷款利息收入怎么开发票
  • 合并报表收费
  • 税控服务费政策
  • win10怎么删除电脑开机密码设置
  • 差额增值税发票和全额增值税发票
  • 应交增值税的完整计算公式是什么
  • 变更营业执照中心怎么改
  • vant3.0
  • 另一种答案
  • vue调用后端接口的方法
  • 供热企业享受增值税吗
  • 投资性房地产成本法转公允价值法
  • php 统计
  • frameworks
  • watch监听不到props数据改变
  • spring security功能
  • 哪些农产品按照鲜品统计
  • 帝国cms上传视频半天没反应
  • 自由会计师
  • 增值税发票抵扣联的作用
  • 长期待摊费用的账务处理
  • 企业所得税会计利润总额计算公式
  • 会计信息采集每年都要采集吗
  • 建筑企业工程结算账务处理
  • percona-toolkit之pt-kill 杀掉mysql查询或连接的方法
  • Mysql获取当前年份
  • 一般纳税人销售旧货可以开专票吗
  • 合伙制律师事务所和个人律师事务所
  • 营业外收支的账户有哪些
  • 办公用品开普票几个点
  • 上一年度主营业务成本多计提了
  • 小规模纳税人已付款对方不开发票几年了会计分录
  • 行政性罚款有哪些
  • 会计结账一般都是谁做
  • 购买软件会计科目
  • mysql安装详细步骤
  • Mysql 5.7.9 shutdown 语法实例详解
  • windows8.1如何分区
  • 使用u盘安装win10
  • bios中英文对照表图新版
  • w7系统删除所有东西
  • win8开机启动项怎么关闭
  • windows xp输入法不见了怎么办
  • 如何卸载centos7
  • win7桌面提示7601
  • xp电脑小游戏
  • centos6.5桌面版安装教程
  • 使用xshell连接虚拟机需要修改哪些配置
  • win7系统360浏览器崩溃
  • 微软开始推送win10
  • win10开始菜单怎么打开
  • javascript 语言精粹(修订版)
  • unity中英文对照
  • perl怎么把字符串变为数字
  • vuex的作用和使用场景
  • jquery插件使用教程
  • 利用的英文
  • google gsoc
  • Firefox window.close()的使用注意事项
  • 重庆电子税务局app下载
  • 河北电子税务局新版登录
  • 黄金税率是多少
  • 个人所得税申报是什么意思
  • 外籍人个人所得税汇算清缴流程
  • 2020北京国税局的待遇
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设