我想编写一个 electron 应用程序,它基于多个窗口。
使用此应用程序,我希望能够在不同窗口中使用不同角色登录网络应用程序。
因此,我需要一个功能来将cookie存储在应用程序不同位置的不同窗口中。 HTML、JS 代码和 cookies 窗口 A 的数据应该看不到 窗口 B 的数据。
或者,我可以以某种方式想象陷阱设置cookie请求并将它们保存在内存中,因此不使用HD上的应用程序全局cookie存储。
有人可以提供此功能的代码吗?
app.setPath()。不幸的是
userData
是应用程序全局的,而不是例如本地窗口。
如果我现在能够捕获每个
BrowserWindow的每个
cookie-set
操作,我就可以使用 app.setPath()
并根据窗口切换 cookie 存储,陷阱就会被触发。
我确实找到了解决方案:
首先创建一个分区。给它命名吧
SomeNameForMySession
:
const partition = 'persist:SomeNameForMySession'
然后将 partition 传递给 BrowserWindow,就像在创建时一样:
var ctrlWindow = new BrowserWindow({
width: 800,
height: 600,
webPreferences: {
partition: partition
}
})
如果另一个 BrowserWindow 获得另一个名称不同的 partition,则窗口具有完全分离的 cookie。 如果另一个 BrowserWindow 获得相同的 partition,则窗口共享 cookie 存储。
使用此功能,您可以跟踪在指定分区的会话中发生的 cookie 事件:
// First find the correct session based on the partitions name
const ses2 = session.fromPartition( partition2 )
// Then, add a listener
ses2.cookies.addListener( 'changed', function ( event, cookie, cause, removed ) {
console.log('COOKIE: ' + cookie.name + ' :: ' + cookie.value )
})
我尝试了同样的解决方案。但对我来说,它仅在我第一次登录时有效。在我关闭应用程序并使用同一分区再次加载它后,不会保存任何会话数据(例如登录信息)。所有内容都被删除,我被重定向到登录页面。你知道为什么会发生这种情况吗?这是我生成窗口的代码:
let chatWindow = new BrowserWindow({
parent: mainWindow,
width: mainWindow.getSize()[0] - 15,
height: mainWindow.getSize()[1] - headerHeight,
x: chatWindowX,
y: chatWindowY,
webPreferences: {
preload: path.join(__dirname, 'preload.js'),
partition: `persist:${chat.id}`
},
我稍后使用相同的代码再次打开窗口,并且 chat.id 相同,因此分区值应该相同,但它忘记了所有登录信息。