如何拦截Electron中指定BrowserWindow的所有请求?
解决Electron仅取消指定窗口HTTP请求的问题
问题根源
你写的代码会影响所有窗口,是因为Electron默认给所有窗口共享同一个全局会话(Session),直接通过win1.webContents.session绑定的请求拦截器,本质是挂在了全局会话上,自然会作用到所有用这个会话的窗口。
靠谱解决方法:给目标窗口用独立会话
给win1单独创建一个隔离的会话,这样拦截器只会绑定到这个专属会话,不会干扰其他窗口。
1. 先创建独立会话
在创建win1之前,用session.fromPartition()生成一个专属分区会话,每个分区的会话都是完全隔离的:
const { BrowserWindow, session } = require('electron') // 自定义分区名称,比如'win1-unique-session',确保和其他窗口的分区名不一样 const win1Session = session.fromPartition('win1-unique-session')
2. 创建窗口时指定这个会话
创建win1的时候,在webPreferences里把session配置成刚才创建的独立会话:
const win1 = new BrowserWindow({ webPreferences: { session: win1Session, // 这里放你原本的其他配置,比如nodeIntegration、contextIsolation之类的 } })
3. 给独立会话绑定拦截器
现在再给这个独立会话加onBeforeRequest拦截,就只会拦截win1的所有请求了:
win1Session.webRequest.onBeforeRequest((detail, callback) => { callback({ cancel: true }) })
临时凑活的方法(不推荐)
如果只是临时需要,不想改会话配置,也可以在拦截器里通过detail.webContentsId判断是不是win1的请求:
// 基于全局会话的判断方式,仅临时场景用 session.defaultSession.webRequest.onBeforeRequest((detail, callback) => { // 对比窗口的webContents.id if (detail.webContentsId === win1.webContents.id) { callback({ cancel: true }) } else { callback({}) // 不拦截其他窗口的请求 } })
注意:这种方式不如独立会话隔离彻底,比如如果有iframe之类的嵌套页面,可能会出现判断不准的情况,优先用独立会话的方案。
内容的提问来源于stack exchange,提问作者legend
相关产品推荐
相关产品推荐

