【Electron】vue项目携带cookie完成第三方网站免登跳转

需求背景:

在原有的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(() => {
    })
  });
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值