chrome插件开发时跨域问题解决方案

news2025/1/23 12:55:20

在这里插入图片描述

这是一个没有套路的前端博主,热衷各种前端向的骚操作,经常想到哪就写到哪,如果有感兴趣的技术和前端效果可以留言~博主看到后会去代替大家踩坑的~接下来的几篇都是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.json
      • background.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进行 委托发送接收

事件的大致流程图如下:
在这里插入图片描述

简单的说,就是在权限开启的情况下,要对接口进行改造,原先直接通过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插件里进行跨域请求,麻烦留个言,告诉一下博主,谢谢~
已经看到这里了,请点个赞吧,谢谢~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/408187.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vue在HTML中如何使用

&#x1f440;Vue是什么 一套用于构建用户界面的渐进式JavaScript框架。 构建用户界面&#xff1a;数据变成界面渐进式&#xff1a;Vue可以自底向上逐层的应用&#x1f440;Vue如何使用 一、引入vue.js <script src"./js/vue.js"></script> 二、准备一个…

HBuilderX uni-app简单实现静态登录页面(实例)

本章用到......uni-app页面跳转uni.navigateTo方法、uni.navigateBack方法。uni-app简单实现邮箱验证码发送点击后读秒样式。登录账号、密码正则表达式验证等 适合刚入门的小伙伴&#xff0c;大佬就没必要看了 静态页面&#xff01;静态页面&#xff01;没有绑定后端数据接口…

拿来即用的前端登录页面(简洁清爽版)

1、使用bootstrap实现 代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>登录</title><link rel"stylesheet" href"/bootstrap-3.3.7-dist/css/bootstrap.m…

vue项目根据不同环境动态配置接口请求ip及全局变量(vue环境变量配置)

在项目的开发过程中&#xff0c;我们常常会遇到根据不同的环境需要切换不同的ip的问题&#xff0c;例如在项目部署到测试服时需要将接口请求ip替换成测试服的ip,部署到正式服时又需要将接口请求ip替换成正式服对应的ip,有些公司还有预发环境等&#xff0c;这样在每次部署不同环…

Vue实战篇三十五:实现滑动拼图验证登录

系列文章目录 Vue基础篇一&#xff1a;编写第一个Vue程序 Vue基础篇二&#xff1a;Vue组件的核心概念 Vue基础篇三&#xff1a;Vue的计算属性与侦听器 Vue基础篇四&#xff1a;Vue的生命周期&#xff08;秒杀案例实战&#xff09; Vue基础篇五&#xff1a;Vue的指令 Vue基础篇…

Please set spring.main.web-application-type=reactive or remove spring-boot-starter-web dependency.

一、问题在启动springcloud的gateway模块的时候报错Please set spring.main.web-application-typereactive or remove spring-boot-starter-web dependency.二、问题产生的原因gateway组件中的 spring-boot-starter-webflux 和 springboot作为web项目启动必不可少的 spring-boo…

前端如何将静态页面部署到服务器,并可以通过公网ip访问。

问题描述 作为卑微的前端页面仔。在我们公司项目上线的时候&#xff0c;一般都是我们前端 npm run build&#xff0c;然后直接把打出来的dist包丢给后端&#xff0c;后端上传到服务器完成前端的部署。这个时候我就很好奇&#xff0c;页面是怎么上传到服务器的呢&#xff1f;上…

vue使用pinia (vue2/vue3)

pinia是什么&#xff1f;Pinia 是 Vue.js 的轻量级状态管理库 官方网站&#xff1a;Pinia 中文文档: 介绍 | Pinia 中文文档 pinia与vuex4 相同 是vue 官方 状态管理工具(作者是 Vue 核心团队成员&#xff09;是vue开发者工具支持pinia 不同 pinia相比vuex4&#xff0c…

云E办Springboot+vue——前端项目完整版(含源码)

一、项目简介 项目背景&#xff1a;受疫情的影响&#xff0c;许多企业由线上办公转为线下办公。随着线上办公的人数的增多&#xff0c;线上办公的优点逐步凸显&#xff1a;通过实现工作流程的自动化、节省企业办公费用、实现绿色办公&#xff0c;同时提升办公效率。 项目介绍…

uniapp在小程序中登录,获取用户信息,获取手机号逻辑记录

这里写目录标题概述uniapp小程序的授权描述授权的详细说明及使用1、微信小程序通过uni.login()方法可以获取到微信提供的code2、通过登录获取的code码可以以获取用户唯一标识openid以及会话密钥sessionkey用于解密获取手机的加密信息3、通过微信提供的获取微信手机号的方法getp…

ELK企业级日志分析平台(二)

文章目录一、kibana数据可视化1.部署2.定制数据可视化&#xff08;1&#xff09;网站访问量&#xff08;2&#xff09;访问量排行榜&#xff08;3&#xff09;创建dashboard&#xff0c;大屏展示二、ES集群监控1.启用xpack认证2.metricbeat监控3.filebeat日志采集一、kibana数据…

【玩转CSS】一文带你了解浮动

&#x1f525;一个人走得远了&#xff0c;就会忘记自己为了什么而出发&#xff0c;希望你可以不忘初心&#xff0c;不要随波逐流&#xff0c;一直走下去&#x1f3b6; &#x1f98b; 欢迎关注&#x1f5b1;点赞&#x1f44d;收藏&#x1f31f;留言&#x1f43e; &#x1f984; …

牛客前端刷题(六)—— JS基础

还在担心面试不通过吗?给大家推荐一个超级好用的刷面试题神器:牛客网,里面涵盖了各个领域的面试题库,还有大厂真题哦! 赶快悄悄的努力起来吧,不苒在这里衷心祝愿各位大佬都能顺利通过面试。 面试专栏分享,感觉有用的小伙伴可以点个订阅,不定时更新相关面试题:面试专栏…

前端面试中经常提到的LRU缓存策略详解

&#x1f431; 个人主页&#xff1a;不叫猫先生 &#x1f64b;‍♂️ 作者简介&#xff1a;2022年度博客之星前端领域TOP 2&#xff0c;前端领域优质作者、阿里云专家博主&#xff0c;专注于前端各领域技术&#xff0c;共同学习共同进步&#xff0c;一起加油呀&#xff01; &am…

微信小程序解决view点击事件穿透地图map触发markertap

微信小程序中使用map组件&#xff0c;ios手机中点击地图上的view&#xff0c;会触发底下的markertap&#xff0c;只要底下如果有marker点的话。 这就造成了用户体验不是很好。 然后无意间我发现点击能滑动的scroll-view反而不会触发底下的markertap&#xff0c;就等于是一个不…

HTML介绍以及常用代码

HTML 网页基础 html(Hyper Text Markup Language)超文本标 记语言&#xff0c;发明者: Tim Berners-leehtml主要是定义网页内容和结构的。html是编 写网页的语言。html只能运行在浏览器上面网页的技术包含: html(编写网页结构&#xff0c;类似人 的骨架)&#xff0c;css(层叠…

前端启动项目npm run dev报错npm ERR! missing script: dev

今天遇到了这样一个nt问题 突然前端跑不起来后面发现是进行npm run dev 命令的时候少进入一层目录 进去之后就可以了对此遇到这个bug我还查了很多blog 发现还有以下两种原因1.打开的是当前文件夹&#xff0c;但是文件夹package.js里的scripts确实没有dev,输入vue init webpack …

【node进阶】深入浅出前后端身份验证(下)---JWT

✅ 作者简介&#xff1a;一名普通本科大三的学生&#xff0c;致力于提高前端开发能力 ✨ 个人主页&#xff1a;前端小白在前进的主页 &#x1f525; 系列专栏 &#xff1a; node.js学习专栏 ⭐️ 个人社区 : 个人交流社区 &#x1f340; 学习格言: ☀️ 打不倒你的会使你更强&a…

【JavaScript】JS实用案例分享:选择器组件 | 简易计算器

&#x1f5a5;️ NodeJS专栏&#xff1a;Node.js从入门到精通 &#x1f5a5;️ 博主的前端之路&#xff08;源创征文一等奖作品&#xff09;&#xff1a;前端之行&#xff0c;任重道远&#xff08;来自大三学长的万字自述&#xff09; &#x1f5a5;️ TypeScript知识总结&…

Axure RP9使用指南

1、快捷键 选中图层移动到上一层 ctrl [ 选中图层移动到下一层 ctrl ] 选中图层移动到顶层 ctrl shift [ 选中图层移动到底层 ctrl shift ] 合并为一组 ctrl G 取消合并 ctrl shift G 锁定位置和尺寸 ctrl K 解锁 ctrl shift K 拖动页面可以按住空格再通过鼠标拖动…