diff --git a/index.html b/index.html
index ebb3fdd..cb3a1f1 100644
--- a/index.html
+++ b/index.html
@@ -1376,6 +1376,11 @@
window.location.href = dest;
return;
}
+ try {
+ sessionStorage.setItem("post_login_redirect", dest);
+ } catch (error) {
+ console.warn("sessionStorage unavailable", error);
+ }
const params = new URLSearchParams({ v: "20261107", redirect: dest });
window.location.href = "/login/?" + params.toString();
}
diff --git a/login/main.ts b/login/main.ts
index 00bc4b1..2b0de6b 100644
--- a/login/main.ts
+++ b/login/main.ts
@@ -71,10 +71,30 @@ function renderQrCode(): void {
}
// 只接受站内绝对路径,避免 ?redirect= 被当作开放重定向
+function consumePostLoginRedirect(): string {
+ try {
+ const stored = sessionStorage.getItem('post_login_redirect')
+ if (stored && stored.startsWith('/') && !stored.startsWith('//')) {
+ sessionStorage.removeItem('post_login_redirect')
+ return stored
+ }
+ } catch (error) {
+ console.warn('读取登录后跳转地址失败', error)
+ }
+ return ''
+}
+
function redirectTarget(): string {
const redirect = new URLSearchParams(window.location.search).get('redirect')
- if (redirect && redirect.startsWith('/') && !redirect.startsWith('//')) return redirect
- return '/generate'
+ if (redirect && redirect.startsWith('/') && !redirect.startsWith('//')) {
+ try {
+ sessionStorage.removeItem('post_login_redirect')
+ } catch (error) {
+ console.warn('清理登录后跳转地址失败', error)
+ }
+ return redirect
+ }
+ return consumePostLoginRedirect() || '/generate'
}
async function cacheTeam(token: string): Promise {