位置: IT常识 - 正文

chrome插件开发时跨域问题解决方案(chrome插件开发语言)

编辑:rootadmin
chrome插件开发时跨域问题解决方案

推荐整理分享chrome插件开发时跨域问题解决方案(chrome插件开发语言),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:chrome插件开发视频教程,chrome 浏览器插件开发,chrome插件开发视频教程,chrome 开发插件,chrome 浏览器插件开发,chrome插件开发文档官方,chrome插件开发入门教程,chrome插件开发视频教程,内容如对您有帮助,希望把文章链接给更多的朋友!

这是一个没有套路的前端博主,热衷各种前端向的骚操作,经常想到哪就写到哪,如果有感兴趣的技术和前端效果可以留言~博主看到后会去代替大家踩坑的~接下来的几篇都是uni-app的小实战,有助于我们更好的去学习uni-app~最近在写一个飞机大战的小游戏,有兴趣的小伙伴可以关注一下 主页: oliver尹的主页 格言: 跌倒了爬起来就好~ 准备篇:https://oliver.blog.csdn.net/article/details/127185461 启动页实现:https://oliver.blog.csdn.net/article/details/127217681 敌机模型的实现:https://oliver.blog.csdn.net/article/details/127332264 requestAnimationFrame详解:https://oliver.blog.csdn.net/article/details/127377916

chrome插件开发时跨域问题解决方案一. 前言二. 官方说明三. 解决方案及实现3.1 方案概述3.2 实现代码manifest.jsonbackground.js消息委托页面四. 小结一. 前言

chrome插件开发时遇到了这么个问题,网页存在一个跨域的请求,在正常的运行web界面时是使用jsonp开发实现的,当打包成chrome插件后,安装进浏览器这个跨域请求竟然他瞄的报错了…度娘了一堆,全他瞄的是错的,然后就有了我接下来3天的焦头烂额,直到我在CSDN看到一篇博文,里面贴了一个公告以及一个链接,接着就有了这篇踩坑记录; 耐心看完,也许你将有所收获~ (PS:如果需要demo的可以留言留邮箱,博主看到后会发给你的~)

二. 官方说明

首先先说结论吧,正常情况下的跨域请求都已经被堵死了,不可再使用,在度娘,CSDN查到的文章,大多数都是在这个chrome的这个版本更新前发布的,因此,文章里面的解决方式也许在那个时候确实有效可行,但目前肯定是不行了,具体我们可以看一下这个更新公告, 官网地址:https://www.chromium.org/Home/chromium-security/extension-content-script-fetches/ 页面截图:

公告中开头第一句就是:

tl;dr: To improve security, cross-origin fetches will soon be disallowed from content scripts in Chrome Extensions. Such requests can be made from extension background pages instead, and relayed to content scripts when needed. [The document has been edited on 2020-09-17 to reflect that CORS-for-content-scripts has successfully launched in Chrome 85*.]

简单的说,就是跨域请求更严格了,原来在content script里面可以实现的跨域请求,现在也被封了(这种方式就是现在度娘或者CSDN中搜索到的绝大多数解决方案,因此全部失效~),同时官方也给出了解决方案,如果你真的是想要实现跨域,到background pages里面去实现吧~ 好吧,那我们就到background pages里去实现吧!

三. 解决方案及实现3.1 方案概述

注意:以下的实现以"manifest_version": 3为例子,版本3和版本2是不同的,因为3中有2里没有的配置项; 根据background的实现,简单的说就是要几处改动:

第一处,在manifest.json开启权限;第二处,jsonp调用的 跨域接口改造,改造成通过background pages进行 委托发送 与 接收;chrome插件开发时跨域问题解决方案(chrome插件开发语言)

事件的大致流程图如下:

简单的说,就是在权限开启的情况下,要对接口进行改造,原先直接通过Jsonp进行的跨域请求要改成不再直接请求后端接口,而是通过chrome提供的API,发送到background.js中,在background.js中预设好接口与消息接收函数,当消息接收函数接收到消息后立刻发送跨域接口,由于接口是在background.js中,因此不会受到跨域拦截,当跨域接口获取到结果后,通过chrome内置的API再返回给页面~

3.2 实现代码manifest.json

在配置文件manifest.json中开启这个权限,代码大致如下:

{ "name": "demo", "version": "0.1.0", "manifest_version": 3, "icons": { "16": "icon/icon16.png", "48": "icon/icon48.png", "128": "icon/icon128.png" }, "host_permissions": ["*://*/*"], "externally_connectable": { "matches": ["*://*.baidu.com/*"] }, "background": { "service_worker": "background.js", "type": "module" }, "permissions": ["activeTab", "bookmarks", "background"], "optional_permissions": ["https://www.google.com/", "https://www.baidu.com"], "chrome_url_overrides": { "newtab": "dist/index.html" }}

这里有几个是非常重要的配置项:

host_permissions:这个是用来开启权限的,这个值如果不设置,那么及时在bakcground.js中跨域还是会被拦截,注意的是这个字段只有在manifest_version为3时才会生效,如果你的manifest_version版本是2,那就不是这个配置项;background:这个是用来指定background pages的,必须加,否则background.js不会执行,这也就导致了我们即使在页面发出了消息,也没有地方可以接收得到,那自然跨域请求不会被执行;background.js

在这个文件中我们要实现的是消息的接收,先看代码

chrome.runtime.onMessage.addListener((request, sender, sendResponse) => { new Promise((resolve, reject) => { if (typeof request !== 'object' || !request.type) { console.error('参数异常'); reject(`消息 ${JSON.stringify(request)} 格式不符合规范`); return; } switch (request.type) { case 'get': fetch(request.url).then((res) => { resolve(res.json()); }); break; case 'test': resolve('测试'); break; } }).then((res) => { sendResponse(res); }); return true;});

这里面有一个chrome官方的API

chrome.runtime.onMessage.addListener((request, sender, sendResponse) => { // 代码... return true;});

差不多可以理解成这是一个用于接收消息的监听器,当触发消息委托时,这个监听器可以捕获到发出的消息,接着里面有一个请求

fetch(request.url).then((res) => { // ...请求});

这里是 以fetch执行了一个跨域请求,将请求到结果后,通过sendResponse()这个函数将值返回到发出消息的页面;

消息委托页面

先看代码

/** * 向Chrome发送消息 * @param message 消息 */export function getData(message: any) { return new Promise((resolve) => { // @ts-ignore chrome.runtime.sendMessage(message, resolve); });}

使用的时候完全像正常的API接口那般使用:

getData({ type: 'get', url: `xxxx`}).then((data: any) => { console.log(data)});

核心的代码其实就这一行

chrome.runtime.sendMessage(message, resolve);

借助的API也是chrome浏览器内置的API,当通过 chrome.runtime.sendMessage 将消息发送出去后,在background.js中会通过 chrome.runtime.onMessage.addListener 接收到,一旦接收到消息,那么会立刻触发跨域的接口,向后台发送请求,接口返回之后又通过 sendResponse(res) 发送到页面, 此时的页面自然也就可以获取到跨域接口的值;

四. 小结

本文简单介绍了在chrome插件的开发中如何解决接口跨域问题,随着谷歌对跨域越来越严格,好多老的方法之前可以用,但现在已经被封了,截止到目前而言,通过background的方式进行跨域访问还是可行的,以后还可不可以那要后续根据谷歌的公告再看~ 如果有别的好的方法,可以在chrome插件里进行跨域请求,麻烦留个言,告诉一下博主,谢谢~ 已经看到这里了,请点个赞吧,谢谢~

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

上一篇:Dinan镇的鹅卵石铺成的街道,法国布列塔尼 (© Scott Wilson/Alamy)(鹅卵石镇宅)

下一篇:Pytorch+PyG实现GCN(图卷积网络)(pytorch go)

  • 怎么二次改变微信号(怎样二次更改微信账号)

    怎么二次改变微信号(怎样二次更改微信账号)

  • 交换机能直接连光猫吗(交换机能直接连DDN线路吗)

    交换机能直接连光猫吗(交换机能直接连DDN线路吗)

  • 抖音直播间怎么隐身(抖音直播间怎么设置观众的隐私)

    抖音直播间怎么隐身(抖音直播间怎么设置观众的隐私)

  • 华为手机老是说sd卡受损(华为手机老是说话)

    华为手机老是说sd卡受损(华为手机老是说话)

  • 荣耀30支持nfc功能吗(荣耀30手机nfc功能支持哪些城市)

    荣耀30支持nfc功能吗(荣耀30手机nfc功能支持哪些城市)

  • 钉钉上课能看到学生吗(钉钉上课能看到学生在干嘛吗)

    钉钉上课能看到学生吗(钉钉上课能看到学生在干嘛吗)

  • airpods pro什么时候出的(airpods pro什么时候出三代)

    airpods pro什么时候出的(airpods pro什么时候出三代)

  • 下载的软件在哪里找到(苹果笔记本下载的软件在哪)

    下载的软件在哪里找到(苹果笔记本下载的软件在哪)

  • 12v23a电池是几号(23a 12v的电池)

    12v23a电池是几号(23a 12v的电池)

  • 小米9第几代指纹识别(小米9是什么指纹)

    小米9第几代指纹识别(小米9是什么指纹)

  • 看不到对方朋友圈背景墙是什么原因(看不到对方朋友圈是被屏蔽了还是被删除了)

    看不到对方朋友圈背景墙是什么原因(看不到对方朋友圈是被屏蔽了还是被删除了)

  • 手机频繁重启却不开机(手机频繁重启却不开机多少钱)

    手机频繁重启却不开机(手机频繁重启却不开机多少钱)

  • 抖音限制字数怎么办(抖音视频字数限制)

    抖音限制字数怎么办(抖音视频字数限制)

  • iphone的经典铃声叫什么(iphone的经典铃声简谱)

    iphone的经典铃声叫什么(iphone的经典铃声简谱)

  • 红米6a可以扩展吗(红米6a怎么扩充存储空间)

    红米6a可以扩展吗(红米6a怎么扩充存储空间)

  • obj的程序称为什么(obj文件的作用)

    obj的程序称为什么(obj文件的作用)

  • word文档删除修改痕迹(word文档删除修改痕迹之后为什么右边有空白的)

    word文档删除修改痕迹(word文档删除修改痕迹之后为什么右边有空白的)

  • Apple Watch Series5怎么使用手电筒

    Apple Watch Series5怎么使用手电筒

  • 苹果xr接电话不显示名字(苹果xr接电话不需要锁屏密码)

    苹果xr接电话不显示名字(苹果xr接电话不需要锁屏密码)

  • 显卡实物怎么看型号(显卡应该怎么看)

    显卡实物怎么看型号(显卡应该怎么看)

  • 苹果手表时间不准怎么调(苹果手表时间不准怎么回事)

    苹果手表时间不准怎么调(苹果手表时间不准怎么回事)

  • qq音乐怎么绑定微信(qq音乐怎么绑定小度音箱)

    qq音乐怎么绑定微信(qq音乐怎么绑定小度音箱)

  • 麒麟985什么时候上市(麒麟985什么时候发布的)

    麒麟985什么时候上市(麒麟985什么时候发布的)

  • 单反相机照片格式(单反相机照片格式怎么转换jpg)

    单反相机照片格式(单反相机照片格式怎么转换jpg)

  • 抖音作品跟动态区别(抖音动态和作品不一样多怎么回事)

    抖音作品跟动态区别(抖音动态和作品不一样多怎么回事)

  • 特卡波湖岸上的羽扇豆,新西兰 (© Stanislav Kachyna/Shutterstock)(特卡波小镇旅游攻略)

    特卡波湖岸上的羽扇豆,新西兰 (© Stanislav Kachyna/Shutterstock)(特卡波小镇旅游攻略)

  • Dedecms织梦利用memberlist标签调用自定义模型中会员(织梦使用教程)

    Dedecms织梦利用memberlist标签调用自定义模型中会员(织梦使用教程)

  • 内账采购含税怎么转不含税
  • 5个点的税点
  • 展位费怎么入账
  • 社保申报后不能缴费
  • 在建期间土地使用税可以资本化吗
  • 法人转入公司的资金怎么做账
  • 金税盘忘了清盘怎么办
  • 社保稽查公司提供不了会计分录怎么办
  • 融资租赁租入固定资产折旧可以税前扣除吗
  • 房地产简易计税税率
  • 购买原材料产生的运输费计入什么科目
  • 增值税专用发票可以开电子发票吗
  • 住房租赁补贴
  • 对方已经认证的发票怎么作废
  • 金税三期里有员工无工资如何申报?
  • 起征点是什么意思举例子说明
  • 税务要求企业所得税预缴申报更正
  • 包装物怎么入账
  • 财务每月需要报哪些税
  • 小规模纳税人三万以下免税
  • 企业代扣员工社保怎样做分录
  • 税务师如何办理入会
  • 谷歌浏览器adobe flash player已不再支持
  • 生产车间工人发放福利
  • 事业单位需要交个人所得税吗
  • wordpress怎么搜索域名
  • 龙骨花的养殖方法作用
  • 股权转让怎么交印花税2019年最新
  • php去除指定字符
  • 生产企业可以抵扣进项税的
  • php注册和登录界面
  • win11升级正式版
  • yii框架的优点及原理
  • 如何快速搭建前端界面
  • 企业发生的利得或损失应计入企业的营业外收支
  • 替票报销财务犯法吗
  • Vue3通透教程【十三】TS简单类型详解
  • wordpress app插件
  • php网站用什么软件修改
  • 到对公账户的钱能立马转出去吗
  • 零申报企业所得税怎么申报
  • 临时工享受的福利有哪些
  • 备用金管理方式
  • mongodb副本集群
  • 个体工商户税收起征点是多少?
  • 电子发票的缺点
  • sql语句表中增加一列
  • sql server 用法
  • 增值税申报表是含税还是不含税
  • 总公司下的分公司破产怎么赔偿
  • 售后回租会计准则
  • 企业股权转让收入会计处理
  • 公司土地被征收怎么办
  • 工地水包水
  • 季度末需要结转本年利润吗
  • 银行利息收入的会计分录怎么写
  • 报关单填制的运费怎么算
  • 会计中原始凭证是什么意思
  • 会计一般月初忙几天
  • mysql 5.6.14 win32 解压缩版(免安装)安装配置教程
  • mysql四个事务的四个特性
  • windows7 设置
  • Win10 Insider 10565去除快捷方式小箭头的方法
  • xp从装系统
  • linux开机流程详解
  • opengl mesa
  • dos删除文件夹下所有文件 不删除父目录
  • Node.js中的什么模块是用于处理文件和目录的
  • android 字体设置
  • td nowrap css nowrap使用说明于注意事项
  • 在javascript中
  • 技术总结结束语
  • jquery判断数据类型
  • 谈谈我对环境保护的认识
  • 文化事业建设税减免政策2023
  • 纳税人被列入非正常户超过三个月的情况
  • 差旅费的补助计入哪个费用
  • 应缴财政专户款属于资产类吗
  • 2.4车船使用税
  • 税务坚定理想信念心得体会
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设