在 Electron 中,默认情况下 不会自动保存 Cookie 或 登录状态,这意味着每次重启应用后用户需要重新登录。为了实现 持久化登录(如闲鱼网页版的自动登录),我们可以利用 Electron 的 session
机制来管理 Cookie 和本地存储。以下是完整的实现方案:
1. 基本原理
-
session
是 Electron 中管理浏览器会话(Cookies、缓存、本地存储)的核心模块。 -
session.defaultSession
是默认会话,所有BrowserWindow
共享。 -
session.fromPartition()
可以创建隔离的会话(适合多账户场景)。
2. 完整代码实现
(1) 初始化项目
npm init -y
npm install electron
(2) 创建 main.js
(完整实现)
const { app, BrowserWindow, session } = require('electron');
const path = require('path');
let mainWindow;
// 配置持久化会话,需要注意需要在app.whenReady里使用,不然会报错
// App threw an error during load
// TypeError: Session can only be received when app is ready
const persistentSession = session.fromPartition('persist:xianyu', { cache: true });
function createWindow() {
mainWindow = new BrowserWindow({
width: 1200,
height: 800,
webPreferences: {
nodeIntegration: false,
contextIsolation: true,
session: persistentSession, // 使用持久化会话
partition: 'persist:xianyu' // 关键:确保所有子窗口共享同一会话
}
});
// 加载闲鱼网页
mainWindow.loadURL('https://www.xianyu.com');
// 监听登录状态(示例:检查 Cookie)
checkLoginStatus();
// 拦截新窗口打开(确保子窗口继承同一会话)
mainWindow.webContents.setWindowOpenHandler(({ url }) => {
return {
action: 'allow',
overrideBrowserWindowOptions: {
webPreferences: {
session: persistentSession, // 子窗口使用相同会话
partition: 'persist:xianyu'
}
}
};
});
}
// 检查登录状态(通过 Cookie)
function checkLoginStatus() {
persistentSession.cookies.get({ url: 'https://www.xianyu.com' })
.then(cookies => {
const isLoggedIn = cookies.some(cookie => cookie.name === '登录Cookie名称');
console.log('用户是否已登录?', isLoggedIn);
});
}
// 启动应用
app.whenReady().then(() => {
// 可选:全局忽略证书错误(仅测试环境用)
session.defaultSession.setCertificateVerifyProc((request, callback) => {
callback(0); // 强制信任所有证书
});
createWindow();
});
app.on('window-all-closed', () => {
if (process.platform !== 'darwin') app.quit();
});
3. 关键配置说明
(1) 持久化会话
const persistentSession = session.fromPartition('persist:xianyu', { cache: true });
-
persist:
前缀表示会话数据会保存到磁盘(app.getPath('userData')
目录)。 -
cache: true
启用缓存,加速后续加载。
(2) 继承会话的子窗口
setWindowOpenHandler({
overrideBrowserWindowOptions: {
webPreferences: {
session: persistentSession, // 子窗口共享同一会话
partition: 'persist:xianyu'
}
}
});
确保所有弹出窗口(如登录弹窗)使用相同的会话,避免登录状态丢失。
(3) 检查登录状态
persistentSession.cookies.get({ url: 'https://www.xianyu.com' })
.then(cookies => {
const isLoggedIn = cookies.some(cookie => cookie.name === '登录Cookie名称');
});
通过检查关键 Cookie(如 _m_h5_tk
)判断用户是否已登录。
4. 高级优化
(1) 手动保存 Cookie(备用方案)
如果自动保存不生效,可以手动存储并恢复:
// 退出前保存 Cookie
app.on('before-quit', () => {
persistentSession.cookies.flushStore();
});
// 启动时恢复 Cookie
app.whenReady().then(() => {
persistentSession.cookies.set({
url: 'https://www.xianyu.com',
name: 'Cookie名称',
value: 'Cookie值',
expirationDate: new Date().getTime() / 1000 + 3600 * 24 * 30 // 30天后过期
});
});
(2) 清除会话数据
// 退出登录时调用
persistentSession.clearStorageData({
storages: ['cookies', 'localstorage']
});
(3) 调试会话
console.log('会话数据路径:', app.getPath('userData'));
// 输出类似:/Users/用户名/Library/Application Support/YourApp/Partitions/persist_xianyu
5. 常见问题解决
Q1: 登录后重启应用,状态丢失?
- 确保所有
BrowserWindow
使用 相同的partition
。 - 检查是否有跨域问题(如
www.xianyu.com
和login.xianyu.com
域名不同)。
Q2: 如何获取闲鱼的关键 Cookie?
- 登录闲鱼网页版后,按
F12
打开开发者工具。 - 进入 Application → Cookies,找到类似
_m_h5_tk
的 Cookie。
Q3: 企业级应用如何增强安全性?
- 使用 加密存储(如
electron-store
+crypto-js
)。 - 限制 Cookie 的作用域和有效期。
总结
功能 | 实现方式 |
---|---|
持久化会话 | session.fromPartition('persist:name') |
子窗口共享登录 | setWindowOpenHandler + 覆盖 webPreferences.session |
检查登录状态 | session.cookies.get() 查询关键 Cookie |
手动管理 Cookie | cookies.set() / cookies.flushStore() |
通过上述方法,你的 Electron 应用可以像浏览器一样 保持闲鱼登录状态,无需用户重复登录!🚀
正文完