非经过允许请勿随意转发,尊重版权,感谢。
背景
Electron
中BrowserWindow
提供比较简易的浏览器界面,但是没有直接提供cookies
持久化和恢复的操作,以至于在关闭窗口后,无法恢复cookies
。
需求
实现cookies
在BrowserWindow
中持久化,以及重启恢复现场
实现方案
初始化浏览器窗口
const {app, BrowserWindow} = require('electron')
const store = new (require('electron-store'))
const sessionCookieStoreKey = 'cookies.mainWindow'
let browserWindow = new BrowserWindow({
width: 800,
height: 600,
webPreferences: {}
})
恢复现场
通过store
提供的本地化接口读取cookies
,在浏览器打开前进行cookies
恢复。
let promise = new Promise((resolve) => {
let cookies = store.get(sessionCookieStoreKey) || [];
let recoverTimes = cookies.length;
if (recoverTimes <= 0) {
//无cookie数据无需恢复现场
resolve()
return;
}
//恢复cookie现场
cookies.forEach((cookiesItem) => {
let {
secure = false,
domain = '',
path = ''
} = cookiesItem
browserWindow.webContents.session.cookies
.set(
Object.assign(cookiesItem, {
url: (secure ? 'https://' : 'http://') + domain.replace(/^\./, '') + path
})
)
.then(() => {
})
.catch((e) => {
console.error({
message: '恢复cookie失败',
cookie: cookiesItem,
errorMessage: e.message,
})
})
.finally(() => {
recoverTimes--;
if (recoverTimes <= 0) {
resolve();
}
})
});
})
保存cookies现场
通过store
提供的本地化接口持久化cookies
数据
promise.then(() => {
//监听cookie变化保存cookie现场
return new Promise((resolve) => {
let isCookiesChanged = false;
browserWindow.webContents.session.cookies.on('changed', () => {
//检测cookies变动事件,标记cookies发生变化
isCookiesChanged = true;
});
//每隔500毫秒检查是否有cookie变动,有变动则进行持久化
setInterval(() => {
if (!isCookiesChanged) {
return;
}
browserWindow.webContents.session.cookies.get({})
.then((cookies) => {
store.set(sessionCookieStoreKey, cookies);
})
.catch((error) => {
console.log({error})
})
.finally(() => {
isCookiesChanged = false;
})
}, 500);
resolve();
})
})
网友评论