Electron对在线网站做数据交互方案,实现在线网站判断Electron调用自定义接口通讯

news2024/11/20 13:38:34

(防盗镇楼)本文地址:https://blog.csdn.net/cbaili/article/details/128651549

前言

最近在撸VUE,想要实现一份代码既能构建Web又能构建Electron应用
并且能够判断环境是浏览器还是Electron,随后在Electron中做一些特定的事情

以往的Electron通信依靠IPC通信完成,但是发布到Web端运行会报错找不到__dirname
这是因为网页浏览器与Electron不同,Electron集成了Node环境,所以Electron能够访问到.

苦寻良久,终于在一个帖子上发现了解决方案:网页与Electron通信


解决方案

这个方案利用Electron的自定义协议实现.
在前端项目中无需引用任何Electron库即可实现与Electron通信,过程可控,完美!

什么是自定义协议?

标准协议就是http https这类的,自定义协议顾名思义就是允许你定义一个协议,自己来实现通信数据处理过程。

你大概率见到过一些网页唤醒本机应用程序的案例,比如百度网盘、Steam等.它们都是利用了这个机制实现。

你可以自定义一个myapp的协议,通过myAPP://lala/?data=123这样的url访问资源

但我们需要的不同,我们不希望去唤醒应用程序,而是直接让Electron拦截掉这个请求。

来看看API

Electron为我们提供了protocol类,它用于注册自定义协议和拦截自定义请求并允许自定义数据处理过程.

这东西用起来很简单,看代码案例:

//electron项目的index.js
const URL = require('url');
const { app, BrowserWindow, protocol } = require('electron')
const MY_CUSTOM_PROTOCOL_SCHEMA="myapp";//命名需要遵循URL PROTOCOL协议

//#第一步:注册自定义协议,必须在app ready之前完成,且只能调用一次
protocol.registerSchemesAsPrivileged([ { scheme: MY_CUSTOM_PROTOCOL_SCHEMA}])

app.on('ready', () => {
    win = new BrowserWindow({ width: 800, height: 600 })
    win.loadURL('http://127.0.0.1:5173/#/')

    if (!process.env.IS_TEST) win.webContents.openDevTools();
	
	//#第二步:定义刚刚注册的自定义协议返回数据类型
	//protocol.registerBufferProtocol
	//protocol.registerFileProtocol
	//protocol.registerHttpProtocol
	//protocol.registerStreamProtocol
	//protocol.registerStringProtocol
	//这里以返回文本为例
    protocol.registerStringProtocol(MY_CUSTOM_PROTOCOL_SCHEMA, (req, res) => {
    	//我们可以使用node.js的url模块对地址进行解析
    	//参考:https://cloud.tencent.com/developer/article/1653911
    	let url = URL.parse(req.url, true)
    	console.log("myapp:// Requested", req, res,url);
    	//do something it here..
        res("lalala")//返回给网页的数据,你可以做成JSON返回
    })
})
//前端js调用部分
callMyapp("asd/ccc?eee=123")
function callMyapp(path){
	const MY_CUSTOM_PROTOCOL_SCHEMA="myapp"
	const url=`${MY_CUSTOM_PROTOCOL_SCHEMA}://${path}`

    //构建get请求(axios不支持自定义协议会报错)
	var httpRequest = new XMLHttpRequest();
  	httpRequest.open('GET', url, true);
    httpRequest.send();
  	httpRequest.onreadystatechange = () => {
    if (httpRequest.readyState == 4 && httpRequest.status == 200) {
      console.log(httpRequest.responseText);
    }
  };
}

以上就实现了简单的通信请求,我们可以通过在Electron中判断请求URL做一些事情了.
还有,URL最大支持2083个字符,所以你要传递的数据文本长度不可以超过这个数字…

辅助

判断网页是否运行在Electron中

const isElectron = /electron/i.test(navigator.userAgent);

上面的代码实现了判断是否运行在Electron中
但运行的Electron不一定是我们自己的app,它内部没有我们注册的自定义协议,这样会导致调用请求的时候报错

所以我们还需要更精准的判断:
我们可以通过查看输出navigator.userAgent,发现其中有一段包含了我们app的名字和版本号
在这里插入图片描述
所以,我们可以通过修改上面的判断条件实现

const isRunInApp = /MGPS_DESKTOP/i.test(navigator.userAgent)

安全考虑

这个方案显然还有一些安全上的问题需要处理,比如:

  • 接口来源认证:不能说随便一个网站用了这个方法就都能调用我们APP的接口
  • 暴力请求过滤:防止系统资源耗尽
  • 加密通信数据:加密get请求的url
  • 防注入等等

  • 所以我们尽量不要在接口中进行一些高危操作,如果要有必须要加验证机制.

最终

有了以上两部分内容,我们可以针对网站运行在我们自己的客户端情况下,做出一些特殊功能支持,比如一些情景:

  • 模拟窗口:在网页浏览器中不显示标题栏按钮 但在Electron中显示并能够让Election响应最大化最小化关闭等按钮事件
  • 绕过一些安全限制:可以从Elecron访问文件系统、操作硬件之类的(注意安全)

话说,这个文章标题真难起…
好用别忘了一按三联哦~

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

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

相关文章

2023年,“新一代”固定资产管理平台——支持低代码平台

固定资产是各企业和工厂的主要生产要素,占企业整体资金比例较重,而且随着企业的发展,实物资产的数量和员工日益增多,固定资产的重要性日益凸显。如何高效管理这些实物资产也成了企业管理者经常考虑的问题。单纯依靠人工表格管理固…

python(一) 字符串基本用法

python(一) 字符串基本用法 目录1.环境安装2. 变量介绍3.变量的命名规则4. 字符串 String 基础4.1 title() 修改单词的大小写 title()4.2 upper() : 将字符串全部改为大写4.3 lower(): 将字符串全部改为小写4.4 字符串的拼接 合并字符串5. 使用制表符或者…

关于抖音年前活动的需求与思考

目录 一、前言 二、需求1 1、后端需求 2、前端需求 三、领取抽卡次数需求 1、后端需求 2、前端需求 四、必得现金红包需求 五、送重复卡需求 1、后端需求 2、前端需求 六、幸运抽奖需求 1、抽奖功能 1.1、首次(或多次)3张节气卡 抽奖 1.2、非首次或多次后5张节气…

【阶段三】Python机器学习14篇:机器学习项目实战:支持向量机分类模型

本篇的思维导图: 项目实战(支持向量机分类模型) 项目背景 目前各大新闻网站很多,网站上的消息也是各式各样,本项目通过建立支持向量机分类模型进行新闻文本分类。 数据收集 所需要的数据文件如下百度云盘链接: 链接:https://pan.baidu.com/s/1Zj-uTt_wdRcmDt3aumZ…

Java加解密(七)数字签名

目录数字签名1 定义2 数字签名特点3 应用场景4 JDK支持的信息摘要算法5 Bouncy Castle 支持的信息摘要算法6 算法调用示例数字签名 1 定义 数字签名(digital signature)是一种电子签名,也可以表示为一种数学算法,通常用于验证消…

【强训】Day06

努力经营当下,直至未来明朗! 文章目录一、选择二、编程1. 不要二2. 把字符串转换成整数答案1. 选择2. 编程普通小孩也要热爱生活! 一、选择 关于抽象类与最终类,下列说法错误的是? A 抽象类能被继承,最终…

C语言零基础项目:六边形扫雷寻宝模式,详细思路+源码分享

程序简介六边形扫雷,寻宝模式,稍稍介绍一下。他也是要把所有安全的地方点出来。他没有扫雷模式的消零算法。每一个安全的点都需要单独挖出来,一次显示一个格子。添加了生命值的概念,也就是说存在一定的容错。显示的数字有别于扫雷…

亚马逊云科技 2022 re:Invent 观察 | 天下武功,唯快不破

引子“天下武功,无坚不摧,唯快不破”,相信大家对星爷电影《功夫》中的这句话耳熟能详。实际上,“天下武功,唯快不破”最早出自古龙先生的著名武侠小说《小李飞刀》:“小李飞刀,例无虚发&#xf…

LeetCode(String) 2325. Decode the Message

1.问题 You are given the strings key and message, which represent a cipher key and a secret message, respectively. The steps to decode message are as follows: Use the first appearance of all 26 lowercase English letters in key as the order of the substit…

React生命周期详解

React 类组件生命周期 React 有两个重要阶段 render 阶段和 commit 阶段,React 在调和( render )阶段会深度遍历 React fiber 树,目的就是发现不同( diff ),不同的地方就是接下来需要更新的地方,对于变化的组件,就会执…

Linux杂谈之java命令

一 java (1)基本解读 ① JAVA8 官方命令行参数 linux版的java 重点关注: java、javac、jar、keytool 这三个参数学习方式: 通过man java和官方文档快速学习 如何在官网搜索 java的命令行参数用法 ② 语法格式 ③ 描述 1)…

Java开发为何深入人心 ?我来带你解开 Spring、IoC、DI 的秘密~

目录 一、什么是Spring? 1.1、什么是容器? 1.2、IoC是什么? 1.3、IoC带来了什么好处? 二、什么是DI? 2.1、IoC和DI有什么关系? 一、什么是Spring? 一句概括,Spring 是包含了众多⼯具⽅法的 IoC 容器…

RHCE第七天之防火墙详解

文章目录一、 基本概念二、iptables三、firewalld四、实验练习一、 基本概念 什么是防火墙?路由策略和策略路由/ipsec vpn gre hdlc ppp 硬件 iDS 在计算中,防火墙是基于预定安全规则来监视和控制传入和传出网络流量的网络安全系统。该计算机流入流出的…

React基础梳理,万字总结,总能帮到你~

第1章:React入门 1.1.React简介 1.英文官网: reactjs.org/2.中文官网: react.docschina.org/3.用于动态构建用户界面的 JavaScript 库(只关注于视图)4.Facebook开源 React的特点 1.声明式编码2.组件化编码3.React Native 编写原生应用4.高效(优秀的D…

CodeCraft-22 and Codeforces Round #795 (Div. 2)

A. Beat The Odds 题目链接: Problem - A - Codeforces 样例输入: 2 5 2 4 3 6 8 6 3 5 9 7 1 3样例输出: 1 0题意:给定一个长度为n的数组,我们可以对这个数组进行操作,每次操作可以删除一个数&#xff…

计算机防勒索病毒之系统主机加固篇

​ 近年来,计算机以及互联网应用在中国得到普及和发展,已经深入到社会每个角落,政府,经济,军事,社会,文化和人们生活等各方面都越来越依赖于计算机和网络,电子政务,无纸办…

如何把WPS转换成PDF格式?新手也能轻松学会的方法

WPS文件是我们工作中必不可少的,它可以编辑文本、记录数据、展示文档等等,都能更好的帮我们处理工作,不过有的时候WPS文件在不同设备上打开可能会出现格式错误或者乱码等一系列的问题,这时候我们就可以将WPS文件转换成PDF文件&…

[Leetcode] 传递信息(有向图路径)

小朋友 A 在和 ta 的小伙伴们玩传信息游戏,游戏规则如下:有 n 名玩家,所有玩家编号分别为 0 ~ n-1,其中小朋友 A 的编号为 0每个玩家都有固定的若干个可传信息的其他玩家(也可能没有)。传信息的…

Python数据分析之Pandas

文章目录前言一、输入输出1.1 txt1.2 csv1.3 excel1.4 json1.5 sql1.6 html1.7 latex二、数据结构2.1 一维数据 Series2.2 二维数据 DataFrame2.2.1 数据查看2.2.2 数据遍历2.2.3 数据选取2.2.4 数据处理2.2.5 数据统计2.3 索引对象 Index2.4 时间戳 TimeStamp三、窗口函数3.1 …

【每日一题】【LeetCode】【第十天】只出现一次的数字

解决之路 题目描述 测试案例(部分) 第一次 和昨天的题目有点类似,昨天是找重复,今天是找不重复。那直接按昨天第二次思路来写这次的代码。 class Solution(object):def singleNumber(self, nums):nums.sort()for i in range(l…