From 950d589f0f8b512a9f87bb790eb849c295e30d50 Mon Sep 17 00:00:00 2001 From: Allen Date: Wed, 30 Apr 2025 23:09:05 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=BD=BF=E7=94=A8=E7=94=9F?= =?UTF-8?q?=E4=BA=A7=E6=A8=A1=E5=BC=8F=E6=89=93=E5=8C=85=E5=90=8E=EF=BC=8C?= =?UTF-8?q?=E8=B0=83=E7=94=A8set-cookie=E5=90=8E=EF=BC=8Cdocument.cookie?= =?UTF-8?q?=E4=BB=8D=E7=84=B6=E4=B8=BA=E7=A9=BA=E7=9A=84=E9=97=AE=E9=A2=98?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assets/list.png | Bin 628 -> 0 bytes src/index.ts | 18 +++++++------- src/login.ts | 13 +--------- src/main.ts | 40 +++++++++++++++++++------------ src/preload.ts | 51 +++++++++++++++++----------------------- src/types/electron.d.ts | 7 ++++-- 6 files changed, 62 insertions(+), 67 deletions(-) delete mode 100644 assets/list.png diff --git a/assets/list.png b/assets/list.png deleted file mode 100644 index e51c78dfd2051487874c85510e3947d420f18b4d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 628 zcmV-)0*n2LP)Px%E=fc|R9Hvtn89n*P!PtyFX`5WrJ$7F3LdN!?4crAJT%>HQP}?=2r7aH#fx5r zDuUq2OQnJr5uxCv7Y`y7t4Z7RPP2ts)zzLm{&GH-tG zdy|>GAvAxeIUjxj&d$Clfak)(YF}W66BL{U&;wu#g14Yt z8ncT}{xu{$zj_1UWdOz>FoM@&h!a$`alSb#C2dhHBx>AfExjR0??ZnjJP;9VogOh*LAy)>$y+hWXfRi$-WvDD;KhL8>{J3xajqwl`R>*Snjaza1sRYa%=hpaIB3BQz&Vr6bJ@l=^FkERtPm zj~zfI`7)|!N{pQ&R+29|ViBR|J>Sng!D)sZ7D|J{r;UC2N6yetOErM1KYhPC7zl3( zQHd?~MIcw3@2xwI!$38NihuMsGY#-m!Xh6;;Ea!2{*LXLUmY~JH**j`s+|PDJA#w+ z7HexD`V#;{12|u@t-Fy;M2z{RmD@i%%>@-jcIo@34FGjNV(mW??aRzAlQ#3$JFQMt z@{WT4zk=FdnzX-mw!y_+^U+5e439J)ziB_fj0&mNBVg4^pSHjDz4!+)bW;9$q27uB O0000 { // 检查登录状态 function checkLoginStatus() { - const auth = document.cookie.split('; ').find(row => row.startsWith('EACToken=') || row.startsWith('MssSsoToken=')); - if (!auth) { + const cookie = window.electronAPI.getSessionStorage('cookie'); + if (!cookie) { window.location.href = 'login.html'; return; } @@ -45,7 +45,7 @@ function checkLoginStatus() { // 处理退出登录 function handleLogout() { - document.cookie = 'expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;'; + window.electronAPI.removeSessionStorage('cookie'); window.location.href = 'login.html'; } @@ -53,7 +53,10 @@ function handleLogout() { async function getMenuList(): Promise { try { const response = await fetch('http://1.12.73.211:8848/EIAC_Desktop_Api/api/Menu/GetMenu', { - method: 'POST' + method: 'POST', + headers: { + 'Content-Type': 'application/json; charset=utf-8' + } }); const result = await response.json() as ApiResponse; @@ -97,14 +100,13 @@ function createMenuItem(item: MenuItem, menuList: MenuItem[]): HTMLLIElement { } } }); - + // 添加当前菜单项的选中状态和图标 li.classList.add('active'); icon.src = item.IconConfig._1x.Selected; const url: string = item.Url.startsWith("http") ? item.Url : `http://${item.Url}`; - - const result = await window.electronAPI.checkUrl(url); + const result = await window.electronAPI.checkUrlAvailable(url); if (result.ok && result.status >= 200 && result.status < 400) { console.log('✅ URL 可访问:', result.status); (document.querySelector("webview") as WebviewTag).src = url; @@ -165,7 +167,7 @@ async function initialize() { const errorModal = document.getElementById('errorModal') as HTMLDivElement; const closeErrorModal = document.getElementById('closeErrorModal') as HTMLButtonElement; // 关闭按钮点击事件 - closeErrorModal.addEventListener('click', (event)=>{ + closeErrorModal.addEventListener('click', (event) => { errorModal.style.display = 'none'; }); diff --git a/src/login.ts b/src/login.ts index 6613491..f56b199 100644 --- a/src/login.ts +++ b/src/login.ts @@ -19,17 +19,6 @@ interface ApiResponse { data: T; } - -// 设置Cookie的示例 -const setCookies = async (cookieString: string) => { - try { - await window.electronAPI.setCookie(cookieString); - console.log('Cookies设置成功'); - } catch (error) { - console.error('设置Cookies失败:', error); - } -}; - // 使用示例 // setCookies('key1=value1; key2=value2; key3=value3'); @@ -63,7 +52,7 @@ async function handleLogin(account: string, password: string): Promise { } else { // 登录成功,将data.Cookies拼接为字符串,存储cookie const cookies = rspBody.data.Cookies.map(cookie => `${cookie.Key.trim()}=${cookie.Value.trim()}`).join('; '); - await setCookies(cookies); + window.electronAPI.setSessionStorage('cookie', cookies); // 跳转到主页面 window.location.href = 'index.html'; } diff --git a/src/main.ts b/src/main.ts index 16e6803..a943908 100644 --- a/src/main.ts +++ b/src/main.ts @@ -10,18 +10,7 @@ if (started) { app.quit(); } -// 处理设置Cookie的IPC请求 -ipcMain.handle('set-cookie', async (event, cookie) => { - try { - await event.sender.session.cookies.set(cookie); - return true; - } catch (error) { - console.error('设置Cookie失败:', error); - return false; - } -}); - -ipcMain.handle('check-url', async (event, rawUrl: string) => { +ipcMain.handle('check-url-available', async (event, rawUrl: string) => { try { const url = new URL(rawUrl); const lib = url.protocol === 'https:' ? https : http; @@ -73,12 +62,34 @@ const createWindow = () => { nodeIntegration: false, // 禁用 Node.js 集成,提高安全性。 preload: path.join(__dirname, 'preload.js'), // 预加载脚本 webviewTag: true, // 启用webview标签 - //webSecurity: false, // 禁用web安全策略 + //webSecurity: false, // 禁用web安全策略,允许跨域请求 //allowRunningInsecureContent: true, // 允许运行不安全的内容 //sandbox: false // 禁用沙箱 }, }); + // // 配置 webview 的权限 + // win.webContents.session.webRequest.onBeforeSendHeaders((details, callback) => { + // callback({ + // requestHeaders: { + // ...details.requestHeaders, + // 'Origin': 'http://1.12.73.211:8848' + // } + // }); + // }); + + // // 配置 webview 的响应头 + // win.webContents.session.webRequest.onHeadersReceived((details, callback) => { + // callback({ + // responseHeaders: { + // ...details.responseHeaders, + // 'Access-Control-Allow-Origin': ['*'], + // 'Access-Control-Allow-Methods': ['GET, POST, PUT, DELETE, OPTIONS'], + // 'Access-Control-Allow-Headers': ['Content-Type, Authorization'] + // } + // }); + // }); + // 隐藏顶部菜单栏 win.setMenuBarVisibility(false); win.setAutoHideMenuBar(true); @@ -113,7 +124,7 @@ const createWindow = () => { // 监听窗口关闭(用户点击右上角X) win.on('close', (event) => { - event.preventDefault(); + event.preventDefault(); win.hide(); }); @@ -134,7 +145,6 @@ const createWindow = () => { tray.on('click', () => { win.show(); }); - }; // This method will be called when Electron has finished diff --git a/src/preload.ts b/src/preload.ts index 3eec1af..5f86588 100644 --- a/src/preload.ts +++ b/src/preload.ts @@ -4,35 +4,26 @@ import { contextBridge, ipcRenderer } from 'electron'; contextBridge.exposeInMainWorld('electronAPI', { - setCookie: async (cookieString: string) => { - const cookies = cookieString.split(';').map(cookie => { - const [name, value] = cookie.trim().split('='); - return { - name: name.trim(), - value: value.trim(), - path: '/', - secure: false, - httpOnly: false, - expirationDate: Math.floor(Date.now() / 1000) + 86400 // 24小时后过期 - }; - }); - - // 为每个域名设置Cookie - const domains = ['localhost', '1.12.73.211']; - const ports = ['', ':8848']; - - for (const cookie of cookies) { - for (const domain of domains) { - for (const port of ports) { - const url = `http://${domain}${port}`; - await ipcRenderer.invoke('set-cookie', { - ...cookie, - url, - domain - }); - } - } - } + // 检查URL是否可用 + checkUrlAvailable: (url: string) => ipcRenderer.invoke('check-url-available', url), + + // 设置 sessionStorage + setSessionStorage: (key: string, value: string) => { + window.sessionStorage.setItem(key, value); }, - checkUrl: (url: string) => ipcRenderer.invoke('check-url', url) + + // 获取 sessionStorage + getSessionStorage: (key: string) => { + return window.sessionStorage.getItem(key); + }, + + // 删除 sessionStorage + removeSessionStorage: (key: string) => { + window.sessionStorage.removeItem(key); + }, + + // 清空 sessionStorage + clearSessionStorage: () => { + window.sessionStorage.clear(); + } }); diff --git a/src/types/electron.d.ts b/src/types/electron.d.ts index 79d2520..2f85f20 100644 --- a/src/types/electron.d.ts +++ b/src/types/electron.d.ts @@ -1,6 +1,9 @@ export interface ElectronAPI { - setCookie: (cookieString: string) => Promise; - checkUrl: (url: string) => Promise<{ ok: boolean; status: number; error?: string }>; + checkUrlAvailable: (url: string) => Promise<{ ok: boolean; status: number; error?: string }>; + setSessionStorage: (key: string, value: string) => void; + getSessionStorage: (key: string) => string | null; + removeSessionStorage: (key: string) => void; + clearSessionStorage: () => void; } declare global {