将登录返回的cookie传递给webview所加载的url

This commit is contained in:
Allen 2025-04-30 23:31:36 +08:00
parent 8c937fc98b
commit bfc8dc2e60
5 changed files with 36 additions and 6 deletions

View File

@ -109,6 +109,8 @@ function createMenuItem(item: MenuItem, menuList: MenuItem[]): HTMLLIElement {
const result = await window.electronAPI.checkUrlAvailable(url);
if (result.ok && result.status >= 200 && result.status < 400) {
console.log('✅ URL 可访问:', result.status);
const cookies: string = window.electronAPI.getSessionStorage('cookie');
await window.electronAPI.setWebviewCookie(url, cookies);
(document.querySelector("webview") as WebviewTag).src = url;
} else {
console.warn('❌ URL 不可访问:', result.error ?? `status ${result.status}`);

View File

@ -51,7 +51,7 @@ async function handleLogin(account: string, password: string): Promise<void> {
errorMessage.textContent = rspBody.msg || '登录失败';
} else {
// 登录成功将data.Cookies拼接为字符串存储cookie
const cookies = rspBody.data.Cookies.map(cookie => `${cookie.Key.trim()}=${cookie.Value.trim()}`).join('; ');
const cookies: string = JSON.stringify(rspBody.data.Cookies);
window.electronAPI.setSessionStorage('cookie', cookies);
// 跳转到主页面
window.location.href = 'index.html';

View File

@ -1,4 +1,4 @@
import { app, BrowserWindow, globalShortcut, ipcMain, Menu, Tray } from 'electron';
import { app, BrowserWindow, globalShortcut, ipcMain, Menu, Tray, session } from 'electron';
import path from 'node:path';
import started from 'electron-squirrel-startup';
import * as http from 'http';
@ -63,6 +63,30 @@ ipcMain.handle('check-url-available', async (event, rawUrl: string) => {
}
});
// 设置webview的cookie
ipcMain.handle('set-webview-cookie', async (event, url: string, cookie: string) => {
try {
const parsedUrl = new URL(url);
const cookies: Array<{ Key: string, Value: string }> = JSON.parse(cookie);
for (const cookieItem of cookies) {
await session.defaultSession.cookies.set({
url: url,
name: cookieItem.Key.trim(),
value: cookieItem.Value.trim(),
domain: parsedUrl.hostname,
path: '/',
secure: parsedUrl.protocol === 'https:',
httpOnly: true
});
}
return true;
} catch (error) {
console.error('设置cookie失败:', error);
return false;
}
});
const createWindow = () => {
// Create the browser window.
const win = new BrowserWindow({

View File

@ -6,22 +6,25 @@ import { contextBridge, ipcRenderer } from 'electron';
contextBridge.exposeInMainWorld('electronAPI', {
// 检查URL是否可用
checkUrlAvailable: (url: string) => ipcRenderer.invoke('check-url-available', url),
// 设置webview的cookie
setWebviewCookie: (url: string, cookie: string) => ipcRenderer.invoke('set-webview-cookie', url, cookie),
// 设置 sessionStorage
setSessionStorage: (key: string, value: string) => {
window.sessionStorage.setItem(key, value);
},
// 获取 sessionStorage
getSessionStorage: (key: string) => {
return window.sessionStorage.getItem(key);
},
// 删除 sessionStorage
removeSessionStorage: (key: string) => {
window.sessionStorage.removeItem(key);
},
// 清空 sessionStorage
clearSessionStorage: () => {
window.sessionStorage.clear();

View File

@ -1,5 +1,6 @@
export interface ElectronAPI {
checkUrlAvailable: (url: string) => Promise<{ ok: boolean; status: number; error?: string }>;
setWebviewCookie: (url: string, cookie: string) => Promise<boolean>;
setSessionStorage: (key: string, value: string) => void;
getSessionStorage: (key: string) => string | null;
removeSessionStorage: (key: string) => void;