Electron 会话、网络与本地存储

使用 session、Cookie 和本地配置保存登录状态与应用设置。

🎯 引言

桌面应用通常需要记住服务地址、登录状态和用户偏好。本篇只介绍常见的保存位置和使用边界,不实现完整登录系统。


🧱 选择合适的存储方式

内容适合位置说明
页面临时状态Vue 响应式数据关闭窗口后消失
普通应用配置JSON 配置文件例如主题、服务地址
网站会话Cookie / session由请求和网页会话使用
敏感凭证系统凭证存储不要明文写进普通配置文件

不要把密码、长期令牌直接放进 localStorage 或普通 JSON 文件。真实项目应使用系统提供的安全凭证存储,并设置退出登录时的清理流程。


🛠 保存普通配置

主进程可以使用 Node.js 的路径和文件 API 保存普通设置:

electron/main.js
const { app } = require('electron/main');
const path = require('node:path');
const { readFile, writeFile } = require('node:fs/promises');

const settingsPath = path.join(app.getPath('userData'), 'settings.json');

async function saveSettings(settings) {
    await writeFile(settingsPath, JSON.stringify(settings, null, 4), 'utf8');
}

async function loadSettings() {
    try {
        return JSON.parse(await readFile(settingsPath, 'utf8'));
    } catch {
        return { theme: 'system' };
    }
}

app.getPath('userData') 会返回当前用户专门保存应用数据的目录。例如:

  • macOS:~/Library/Application Support/应用名称
  • Windows:C:\Users\用户名\AppData\Roaming\应用名称
  • Linux:~/.config/应用名称

这里的“项目目录”是你开发时放 package.json 和源码的文件夹;“安装目录”是用户安装应用后,存放应用程序文件的地方。这两个位置都不适合保存用户配置:项目目录只属于开发环境,安装目录可能没有写入权限,应用更新时也可能被替换。

userData 则属于当前用户,适合保存主题、服务地址等普通设置。上面的 settingsPath 最终就是把 settings.json 放在这个目录里。


🌐 读取会话信息

如果 Electron 窗口打开了一个需要登录的网页,登录成功后,网站通常会把登录凭证保存为 Cookie。之后这个窗口再次请求同一个网站时,Electron 会自动带上 Cookie,用户就不需要每次重新登录。

这些 Cookie 由窗口的 session 管理。大多数时候我们不需要自己读取 Cookie,只有在需要显示登录状态或排查登录问题时,才会读取它:

electron/main.js
const cookies = await win.webContents.session.cookies.get({
    url: 'https://example.com',
});

console.log('当前会话 Cookie 数量:', cookies.length);

这段代码的作用只是查看当前窗口保存了多少个该网站的 Cookie。它不会自动登录,也不会凭空创建登录状态。

用户点击“退出登录”时,可以清理这个网站的 Cookie:

await win.webContents.session.clearStorageData({
    origins: ['https://example.com'],
    storages: ['cookies'],
});

win.reload();

清理后重新加载页面,网站就会发现登录 Cookie 不存在,通常会回到登录页面。origins 用来限制清理范围,避免误删其他网站的会话。

session 管理的是网页登录状态,app.getPath('userData') 管理的是应用配置文件,它们解决的是两件不同的事。

🧾 小节总结

  • 临时状态、普通配置、Cookie 和敏感凭证应分开保存。
  • 普通配置可以保存到 app.getPath('userData')
  • Cookie 由窗口的 session 管理。
  • 退出登录时要清理会话数据。
  • 敏感凭证不能明文写入配置文件。

❓ 知识问答

Q1:为什么不把配置放在项目目录?

A:安装目录可能没有写入权限,更新应用时也可能被覆盖。

Q2:Cookie 和普通配置文件有什么区别?

A:Cookie 主要服务于网页请求,会随会话规则发送;配置文件适合保存主题、地址等应用设置。

🧪 小练习

把下面的设置对象保存到 userData 目录:

const settings = {
    // 请在这里编写代码
};

🎉 现在你已经能为桌面应用规划基本的会话和配置存储了。