Electron

electron 中的 cookies 持久化保存到硬盘及恢复现

2019-10-15  本文已影响0人  ankerjian

非经过允许请勿随意转发,尊重版权,感谢。

背景

ElectronBrowserWindow提供比较简易的浏览器界面,但是没有直接提供cookies持久化和恢复的操作,以至于在关闭窗口后,无法恢复cookies

需求

实现cookiesBrowserWindow中持久化,以及重启恢复现场

实现方案

初始化浏览器窗口
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();
                })
            })
上一篇 下一篇

猜你喜欢

热点阅读