美文网首页Electron
electron 中的 cookies 持久化保存到硬盘及恢复现

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

作者: ankerjian | 来源:发表于2019-10-15 16:59 被阅读0次

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

    背景

    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();
                    })
                })
    

    相关文章

      网友评论

        本文标题:electron 中的 cookies 持久化保存到硬盘及恢复现

        本文链接:https://www.haomeiwen.com/subject/fgbsmctx.html