【Electron】vue项目携带cookie完成第三方网站免登跳转
vue
vuejs/vue: 是一个用于构建用户界面的 JavaScript 框架,具有简洁的语法和丰富的组件库,可以用于开发单页面应用程序和多页面应用程序。
项目地址:https://gitcode.com/gh_mirrors/vu/vue
免费下载资源
·
需求背景:
在原有的Vue项目,后端能获取到目标网站的cookie,前端通过携带cookie打开新窗口并完成免登操作。
Electron
- 使用electron forge创建electron项目,详见官网文档
- 在主线程文件main.js/index.js(参考具体项目配置package.json文件main指向),添加事件监听
- 主线程:
const { app, BrowserWindow, ipcMain } = require('electron');
// createWindow为工具默认打开的浏览器
const createWindow = () => {
const mainWindow = new BrowserWindow({
show: false,
webPreferences: {
preload: path.join(__dirname, 'preload.js'),
nodeIntegration: true, // 设置开启nodejs环境
enableRemoteModule: true,
contextIsolation: false,
},
});
mainWindow.maximize() // 打开全屏
// 加载指定网址 指向自己的项目地址
mainWindow.loadURL('xxx.com');
mainWindow.show()
// 监听打开自定义协议的事件(主要)
ipcMain.on('open-third-page', (event, cookie) => {
// cookie为事件接收参数
event.preventDefault();
// 发送事件到渲染进程,传递URL参数
createNewWindow(cookie)
});
};
// 程序准备好之后触发打开默认页面
app.on('activate', () => {
if (BrowserWindow.getAllWindows().length === 0) {
createWindow();
}
});
- 在preload文件向项目注入ipcRenderer
const { ipcRenderer } = require('electron');
// 所有的 Node.js API接口 都可以在 preload 进程中被调用.
window.addEventListener('DOMContentLoaded', (e, arg) => {
const replaceText = (selector, text) => {
const element = document.getElementById(selector)
if (element) element.innerText = text
}
for (const dependency of ['chrome', 'node', 'electron']) {
replaceText(`${dependency}-version`, process.versions[dependency])
}
})
// 页面注入ipcRenderer
window.ipcRenderer = ipcRenderer;
VUE项目
如果用electron打开项目地址,则已经通过preload注入ipcRenderer挂在到window,可以通过window.ipcRenderer
来判断当前是否electron环境中,如果判断是,则走electron交互事件的逻辑
handleClick(){
if (window.ipcRenderer) {
// 触发自定义事件
// 事件名要与监听的一致 cookie为向electron发送的参数
window.ipcRenderer.send('open-third-page', cookie)
} else {
// 不在electron环境
}
}
Electron触发自定义事件
const createNewWindow = (cookieData) => {
const partition = Date.now().toString() // session隔离 要设定唯一的string 否则窗口多开的话
const mainWindow = new BrowserWindow({
show: true,
webPreferences: {
preload: path.join(__dirname, 'preload.js'),
// nodeIntegration: true, // 设置开启nodejs环境
enableRemoteModule: true, // enableRemoteModule保证renderer.js可以可以正常require('electron').remote,此选项默认关闭
contextIsolation: true,
partition,
},
});
mainWindow.maximize()
const { session } = mainWindow.webContents;
const { cookies } = session;
// 等待cookie初始化完成
function waitCookieInit() {
return new Promise(function (resolve) {
setTimeout(resolve, 3000);
});
};
// 替换cookie
function cookieReplace(cookies, cookie) {
return cookies.remove(cookie.url, cookie.name).then(() => {
return cookies.set(cookie);
})
};
// 批量设置目标值
const cookieValue = []
// 多个cookie的情况下 遍历去设置参数
// 默认格式{cookie的key值: cookie的value}
const keyList = Object.keys(cookieData);
keyList.forEach(key => {
cookieValue.push(
{
url: 'xxx.com', // 目标第三方网址
name: key, // 第三方网址cookie的key值
value: cookieData[key], // cookie的value值
domain: '.xxx.com', // domain要设置的值
expirationDate: 99999999999 // 过期时间
}
)
})
// 批量替换
waitCookieInit().then(() => {
const promises = cookieValue.map(cookie => cookieReplace(cookies, cookie));
return Promise.all(promises).then(() => {
// 设置成功
mainWindow.loadURL('xxxx.com'); // 加载指定第三方网址
// mainWindow.webContents.openDevTools();
}).catch(() => {
// 设置失败
}).finally(() => {
})
});
}
GitHub 加速计划 / vu / vue
80
16
下载
vuejs/vue: 是一个用于构建用户界面的 JavaScript 框架,具有简洁的语法和丰富的组件库,可以用于开发单页面应用程序和多页面应用程序。
最近提交(Master分支:4 个月前 )
73486cb5
* chore: fix link broken
Signed-off-by: snoppy <michaleli@foxmail.com>
* Update packages/template-compiler/README.md [skip ci]
---------
Signed-off-by: snoppy <michaleli@foxmail.com>
Co-authored-by: Eduardo San Martin Morote <posva@users.noreply.github.com> 6 个月前
e428d891
Updated Browser Compatibility reference. The previous currently returns HTTP 404. 6 个月前
更多推荐
已为社区贡献1条内容
所有评论(0)