提交 379e1cf8 authored 作者: 朱政's avatar 朱政

feat:完善登录及退出登录功能

上级 731c0603
流水线 #425 已通过 于阶段
in 1 分 41 秒
......@@ -85,6 +85,7 @@ import { useRouter } from "vue-router";
import { useRoute } from "vue-router";
import { getPersonType } from "@/api/common/index";
import request, { removeToken } from "@/api/request.js";
import { broadcastAuthLogout } from "@/utils/authCrossTabLogout.js";
import SearchBar from "@/components/layout/SearchBar.vue";
import Menu1 from "@/assets/icons/overview/menu1.png";
......@@ -478,6 +479,7 @@ const handleUserCommand = async (command) => {
} catch {
// ignore
}
broadcastAuthLogout();
try {
window.sessionStorage.removeItem("auth_token");
} catch {
......
import { createRouter, createWebHistory } from "vue-router";
import { setToken, removeToken, getToken } from "@/api/request.js";
import { AUTH_LOGOUT_CHANNEL } from "@/utils/authCrossTabLogout.js";
/** localStorage:跨标签页记录当前前端的 bootId(与 vite define 的 __APP_BOOT_ID__ 对齐) */
const VITE_BOOT_STORAGE_KEY = "app_vite_boot_id";
......@@ -241,5 +242,59 @@ router.beforeEach((to, from, next) => {
next();
});
/**
* 在其它标签页/窗口退出登录时,本页立即跳转登录页(不依赖用户再点一次路由)。
* 1)storage:监听同源其它文档对 `force_login` 的写入
* 2)BroadcastChannel:与登出时的 `broadcastAuthLogout()` 配对,减少仅依赖 storage 的时序问题
*/
function installCrossTabLogoutRedirect() {
if (typeof window === "undefined") {
return;
}
const redirectToLoginAfterRemoteLogout = () => {
try {
window.localStorage.setItem(FORCE_LOGIN_KEY, "1");
} catch {
// ignore
}
try {
removeToken();
window.localStorage.removeItem("auth_token");
window.sessionStorage.removeItem("auth_token");
} catch {
// ignore
}
try {
if (router.currentRoute.value.path !== "/login") {
router.replace({ path: "/login", replace: true }).catch(() => {});
}
} catch {
// ignore
}
};
window.addEventListener("storage", (e) => {
if (e.key !== FORCE_LOGIN_KEY || e.newValue !== "1") {
return;
}
redirectToLoginAfterRemoteLogout();
});
try {
if (typeof BroadcastChannel !== "undefined") {
const authBroadcast = new BroadcastChannel(AUTH_LOGOUT_CHANNEL);
authBroadcast.addEventListener("message", (ev) => {
if (ev?.data?.type === "force_logout") {
redirectToLoginAfterRemoteLogout();
}
});
}
} catch {
// ignore
}
}
installCrossTabLogoutRedirect();
export default router;
/** 与 `router/index.js` 中 BroadcastChannel 监听使用同一频道名 */
export const AUTH_LOGOUT_CHANNEL = "risk_monitor_auth";
/**
* 通知同源其它标签页/窗口:用户已退出,应立即进入登录页。
* 与 localStorage `force_login=1` 配合;发起退出的标签页在写入后调用一次即可。
*/
export function broadcastAuthLogout() {
try {
if (typeof BroadcastChannel === "undefined") {
return;
}
const ch = new BroadcastChannel(AUTH_LOGOUT_CHANNEL);
ch.postMessage({ type: "force_logout" });
ch.close();
} catch {
// ignore
}
}
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论