非經(jīng)過允許請勿隨意轉(zhuǎn)發(fā)涤姊,尊重版權(quán),感謝嗤放。
背景
Electron
中BrowserWindow
提供比較簡易的瀏覽器界面思喊,但是沒有直接提供cookies
持久化和恢復(fù)的操作,以至于在關(guān)閉窗口后次酌,無法恢復(fù)cookies
恨课。
需求
實現(xiàn)cookies
在BrowserWindow
中持久化,以及重啟恢復(fù)現(xiàn)場
實現(xiàn)方案
初始化瀏覽器窗口
const {app, BrowserWindow} = require('electron')
const store = new (require('electron-store'))
const sessionCookieStoreKey = 'cookies.mainWindow'
let browserWindow = new BrowserWindow({
width: 800,
height: 600,
webPreferences: {}
})
恢復(fù)現(xiàn)場
通過store
提供的本地化接口讀取cookies
岳服,在瀏覽器打開前進(jìn)行cookies
恢復(fù)剂公。
let promise = new Promise((resolve) => {
let cookies = store.get(sessionCookieStoreKey) || [];
let recoverTimes = cookies.length;
if (recoverTimes <= 0) {
//無cookie數(shù)據(jù)無需恢復(fù)現(xiàn)場
resolve()
return;
}
//恢復(fù)cookie現(xiàn)場
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: '恢復(fù)cookie失敗',
cookie: cookiesItem,
errorMessage: e.message,
})
})
.finally(() => {
recoverTimes--;
if (recoverTimes <= 0) {
resolve();
}
})
});
})
保存cookies現(xiàn)場
通過store
提供的本地化接口持久化cookies
數(shù)據(jù)
promise.then(() => {
//監(jiān)聽cookie變化保存cookie現(xiàn)場
return new Promise((resolve) => {
let isCookiesChanged = false;
browserWindow.webContents.session.cookies.on('changed', () => {
//檢測cookies變動事件,標(biāo)記cookies發(fā)生變化
isCookiesChanged = true;
});
//每隔500毫秒檢查是否有cookie變動吊宋,有變動則進(jìn)行持久化
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();
})
})