<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
Electron 提供的 webRequest API,允許開發者對網路進行過濾和監聽,並且可以修改 header 欄位甚至請求地址,功能非常強大,它的類結構如下:
不過需要注意,該模組只能在主程序中使用,接下來為大家介紹 webRequest 三個非常典型的使用場景:
有些介面為了過濾非法請求,會首先校驗 UserAgent,正常的瀏覽器是無法偽造 UA 的,不過在 Electron 裡面可以很容易做到,webRequest 模組提供的 onBeforeSendHeaders
方法能夠對域名進行過濾,攔截即將發出去的請求頭,修改之後再真正的發出去。例如下面的程式碼會在存取 github 相關域名的時候,把 header 中的 User-Agent 欄位修改為 MyAwesomeAgent:
const { session } = require('electron') const filter = { urls: ['https://*.github.com/*'] } session.defaultSession.webRequest.onBeforeSendHeaders(filter, (details, callback) => { details.requestHeaders['User-Agent'] = 'MyAwesomeAgent' callback({ requestHeaders: details.requestHeaders }) })
使用 Electron 載入第三方網站的時候,預設行為和 Chrome 是一致的,都會受到同源策略的影響,為了驗證,我們首先載入本地 3020 埠上的靜態檔案:
win = new BrowserWindow({ width: 600, height: 400 }) win.loadURL('http://localhost:3020') win.webContents.toggleDevTools({ mode: 'bottom' })
然後在 3030 埠上啟動一個 http 服務:
const Koa = require('koa') const app = new Koa() app.use((ctx, next) => { ctx.body = { success: true, } }) app.listen(3030)
此時在控制檯請求 3030 埠上的服務,會發現典型的跨域報錯,果不其然被 cors 策略拒絕了:
瞭解跨域原理的同學都知道,其實網路請求是已經回來了,但是瀏覽器會檢查 response header 裡面的 Access-Control-Allow-Origin
,如果當前域名不在裡面,就 block 這個響應,如下圖所示:
要想讓瀏覽器不 block 響應的話,傳統的解決方案一般有兩種:
Access-Control-Allow-Origin
,支援當前的 Origin而在 Electron 裡面,又多了一種方案,因為 Electron 可以對網路請求進行攔截,任意修改請求或響應的 header,那麼只要把響應檔頭裡面的 Access-Control-Allow-Origin
改掉不就好了麼:
程式碼如下:
const filter = { urls: ['http://localhost:*/*'], } win.webContents.session.webRequest.onHeadersReceived(filter, (details, callback) => { const { responseHeaders } = details responseHeaders['Access-Control-Allow-Origin'] = ['*'] callback({ responseHeaders }) })
開啟網路面板觀察網路請求,響應檔頭裡面就有 Access-Control-Allow-Origin
了,成功繞過 cors 校驗:
通過 webRequest API,可以將發到介面 A 的請求轉發到介面 B。為了驗證這個能力,我們寫了一個 http 服務,同時監聽 3030 和 4040 埠,並響應 JSON 資料,裡面包含了 port 欄位表示當前請求到了哪個埠:
const http = require('http') const URL = require('url') function listen(port) { http .createServer((req, res) => { const { url, method, headers } = req const { query, pathname } = URL.parse(url, true) res.setHeader('Content-Type', 'application/json') res.end(JSON.stringify({ method, pathname, query, headers, port })) }) .listen(port) } listen(3030) listen(4040)
然後通過 onBeforeRequest
方法進行攔截:
win.webContents.session.webRequest.onBeforeRequest( { urls: ['http://localhost:3030/*'], }, (details, callback) => { callback({ redirectURL: 'http://localhost:4040' }) }, )
在控制檯傳送 3030 埠請求,結果返回了 4040 埠的資料:
這個能力非常強大,例如可以做下面的事情:
以上就是Electron 網路攔截實戰範例詳解的詳細內容,更多關於Electron 網路攔截的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45