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

  • 希沃白板如何设置触发动画(希沃白板如何设置点击出现答案)

    希沃白板如何设置触发动画(希沃白板如何设置点击出现答案)

  • ipad返回键在哪(ipad返回键怎么返回上一步)

    ipad返回键在哪(ipad返回键怎么返回上一步)

  • 网易云怎么下载mp3格式的音乐(网易云怎么下载mv)

    网易云怎么下载mp3格式的音乐(网易云怎么下载mv)

  • 微信表情包上限扩充(微信表情包上限是多少)

    微信表情包上限扩充(微信表情包上限是多少)

  • 电脑为什么蓝屏怎么解决(电脑为什么蓝屏开不了机)

    电脑为什么蓝屏怎么解决(电脑为什么蓝屏开不了机)

  • 美版苹果x没有原彩显示(美版苹果x没有电池百分比)

    美版苹果x没有原彩显示(美版苹果x没有电池百分比)

  • 电脑突然白屏了按哪个键可以修复(电脑突然白屏了是什么意思)

    电脑突然白屏了按哪个键可以修复(电脑突然白屏了是什么意思)

  • 华为手机自带浏览器卸载(华为手机自带浏览器图标出现数字)

    华为手机自带浏览器卸载(华为手机自带浏览器图标出现数字)

  • 华为的盲人模式哪里关(华为盲人模式是什么样子的)

    华为的盲人模式哪里关(华为盲人模式是什么样子的)

  • 序列号c开头的是什么机型(序列号c开头的苹果)

    序列号c开头的是什么机型(序列号c开头的苹果)

  • 3gqq还能登录吗(3gqq还能登陆吗)

    3gqq还能登录吗(3gqq还能登陆吗)

  • gtx1660super配什么显示器

    gtx1660super配什么显示器

  • b612可以录制多长的视频(b612视频可以录几分钟)

    b612可以录制多长的视频(b612视频可以录几分钟)

  • 荣耀20是5G手机吗(荣耀20i是5g)

    荣耀20是5G手机吗(荣耀20i是5g)

  • 使用icloud的App需要打开吗(使用icloud的app icloud云盘)

    使用icloud的App需要打开吗(使用icloud的app icloud云盘)

  • 为什么爱奇艺快进会震动(为什么爱奇艺快捷键打开转到网页了)

    为什么爱奇艺快进会震动(为什么爱奇艺快捷键打开转到网页了)

  • iphone11电池容量(iphone11电池容量多大)

    iphone11电池容量(iphone11电池容量多大)

  • pc机除加电冷启动外按什么键相当于冷启动(pc机除加电冷启动外)

    pc机除加电冷启动外按什么键相当于冷启动(pc机除加电冷启动外)

  • 抖音里的抖币怎么提现(抖音里的抖币怎么换成钱)

    抖音里的抖币怎么提现(抖音里的抖币怎么换成钱)

  • 抖音怎么做商品橱窗(抖音怎么做商品推广)

    抖音怎么做商品橱窗(抖音怎么做商品推广)

  • 京东怎么取消预约时间(京东怎么取消预购)

    京东怎么取消预约时间(京东怎么取消预购)

  • 局域网是什么意思啊(局域网是什么意思啊网络用语)

    局域网是什么意思啊(局域网是什么意思啊网络用语)

  • oppo手机关机键失灵(oppo手机关机键按了没反应)

    oppo手机关机键失灵(oppo手机关机键按了没反应)

  • 手机关机发视频显示什么(手机关机发视频什么提示)

    手机关机发视频显示什么(手机关机发视频什么提示)

  • 万用表档位功能有哪些(万用表档位的使用方法)

    万用表档位功能有哪些(万用表档位的使用方法)

  • Linux使用xinetd服务的管理方法案例详解(如何使用linux服务器)

    Linux使用xinetd服务的管理方法案例详解(如何使用linux服务器)

  • 中税税务咨询
  • 软件研发阶段和开发阶段如何区分
  • 微店企业和个人的区别
  • 承兑汇票属于货款吗
  • 环评费用怎么入账
  • 计提坏账所得税费用分录
  • 公司基本户如何注销
  • 小规模纳税人生活服务业免征增值税
  • 一个人可以在多家公司任职吗
  • 发票二维码只有一半可以收吗
  • 一个月作废发票多会有影响吗?
  • 当月销项税大于进项税怎么办
  • 企业咨询评估
  • 某企业月末由仓库转来发料凭证汇总表
  • 样机销售是什么意思
  • 双薪制工资如何缴纳个人所得税?
  • 企业会议费发票可否抵扣?
  • 代开专票需要去报税吗?
  • 一般纳税人能开普票吗,几个点
  • 小规模纳税人和小微企业区别
  • 开票系统的收款码怎么弄
  • 企业所得税汇算清缴退税怎么做账务处理
  • 电子发票作废怎么做
  • 通行费发票怎么开
  • 供热企业所使用的燃气
  • 申报的国家资助的一个项目如何进行账务处理?
  • 收回委托加工物资的账务处理
  • 工程安装人工外包合同怎么写
  • microsoft edge怎么设置关闭所有网页
  • 一次性计提折旧的政策
  • 临时工工资的会计处理
  • 销售已使用过的固定资产增值税税率
  • 期初留存收益是什么科目
  • php数组函数输出《咏雪》里有多少"片"字
  • wamp设置
  • 货运代理开票
  • ipad最长使用时间
  • 固定资产折旧企业所得税税前扣除标准
  • apache无法访问自己的页面
  • 法人跟纳税人必须是一个人吗
  • vue项目更新后还是老代码
  • mac datagrip
  • 华为mate主题
  • css中字符间距怎么设置
  • sqlserver四舍五入到整数
  • 个体户3万免税规定2019
  • 什么是指企业的所有部门彼此协调为顾客服务
  • 社保缴费是当月扣当月的吗
  • 计提坏账准备和确认坏账损失
  • db2 21000怎么解决
  • 国际货运代理需要什么样的人才
  • 期货风险准备金计提比例
  • 接受母公司捐赠现金分录
  • 收到银行贷款发放成功的短信
  • 应收账款计提坏账影响利润吗
  • 银行贷款需要哪些材料
  • 利润分配明细科目有哪些
  • 内账的表格怎么做
  • 筹建期间发生的长期借款利息费用计入财务费用
  • 待处理财产损溢属于什么类科目?
  • 暂估费用票的账务处理
  • 列举2-4种特殊销售方式,其销售额如何确认?
  • 旅客运送的一般规定
  • 退回的银行手续费做什么科目
  • 固定资产收到专票怎么做账
  • 主营业务成本做多了怎么办
  • 分类不同
  • 关于植物的现代诗
  • macos 右键菜单
  • linux中man的用法
  • win7资源管理器频繁崩溃
  • linux操作系统版本有哪些
  • Win7摄像头怎么打开
  • unity3d官方教程
  • javascript中字符串
  • 税务局电子化
  • 税务稽查人员工作总结
  • 房子有注册公司可以卖吗
  • 江西省国税局全称
  • 印花税由哪方缴纳
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设