Electron使用时拦截HTTP请求的解决方案

背景

最近在做一个Web和Electron共用一份代码的工程,由于使用到了第三方的库(我们是在线地图),该库的认证方式是请求时加key,并且它在后台会校验referer。

于是问题就来了,Electron是运行在本地的,http请求的时候,是不会带有授权Web站点的referer的。导致认证失败,无法调用所需的api接口。

分析

既然HTTP请求发送的时候不带referer,那么我们给他加上去,是不是就可以了呢?

对策

方法1:自定义HTTP协议,在发送请求时,补上referer

1// 注册自定义协议 2protocol.registerStandardSchemes(['app', '自定义协议'], { secure: true }) 3// 自定义协议的具体实现 4protocol.registerHttpProtocol('自定义协议', (req, cb) => { 5 cb({ 6 url: “特定的url地址”, 7 referrer: "http://被授权的referrer头信息" 8 }) 9 }) 10// 发送请求时可以使用 自定义协议://url地址 的形式来发送请求 11 12发送请求时可以使用 自定义协议://url地址 的形式来发送请求。当然,我们这个例子里面只是追加了referrer,其实根据实际需求还可以做很多其它事情。相关api文档:https://electronjs.org/docs/api/protocol#protocolregisterhttpprotocolscheme-handler-completion

方法2:修改窗口会话中发送请求前的行为

本来以为方法1以及很完美的解决了问题,但是,在自定义协议认证成功后,在api的使用过程中,api内部主动发送了http请求,这时的api请求没有使用自定义协议,再次认证失败了。于是我想到有个办法,很天真的认为可以解决问题。失败的做法如下:

1protocol.interceptHttpProtocol("http", (req, cb) => { 2 // 此处可以追加url是否匹配的逻辑判断 3 cb({ 4 url:req.url, 5 referrer: "http://授权的referrer头信息" 6 }) 7 }) 8 9相关api文档:https://electronjs.org/docs/api/protocol#protocolintercepthttpprotocolscheme-handler-completion

我直接拦截了原生的http协议,追加referrer信息,发生的结果是,http->截获http->修改后发送http->截获http->修改后发送http->......发生了无限循环!!!

于是只能另辟蹊径,寻找其余解决方案。发现了webquest的行为可以捕获。于是在onBeforeSendHeaders的时机,追加Referer信息。正确的做法如下:

1// 需要拦截的URL地址 2 const xxx_filter = { 3 urls: ["https://*.xxx.com/*", "http://*.yyy.com/*"] 4 } 5 session.defaultSession.webRequest.onBeforeSendHeaders(xxx_filter, (details, callback) => { 6 details.requestHeaders['Referer'] = 'http://授权的referer头信息' 7 callback({ requestHeaders: details.requestHeaders }); 8 }) 9 10相关api文档:https://electronjs.org/docs/api/web-request

总结

通过对webrequest的捕获,解决了本次的问题,并且把自定义协议那个案也可以替换掉。webrequest还有好几个阶段的行为可以自定义,可以适用于不同场景的需求。

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

java将前端的json数组字符串转换为列表

记录下在前端通过ajax提交了一个json数组的字符串,在后端如何转换为列表。前端数据转化与请求varcontracts{id:'1',name:'yanggb合同1'},{id:'2',name:'yanggb合同2'},{id:'3',name:'yang

Electron使用时拦截HTTP请求的解决方案 - HelloWorld