61 lines
1.7 KiB
TypeScript
61 lines
1.7 KiB
TypeScript
import { removeToken, setToken } from "./auth";
|
||
import { subBefore, getQueryMap } from "@pureadmin/utils";
|
||
import { LoginResult } from "@/api/login";
|
||
|
||
/**
|
||
* 简版前端单点登录,根据实际业务自行编写
|
||
* 划重点:
|
||
* 判断是否为单点登录,不为则直接返回不再进行任何逻辑处理,下面是单点登录后的逻辑处理
|
||
* 1.清空本地旧信息;
|
||
* 2.获取url中的重要参数信息,然后通过 setToken 保存在本地;
|
||
* 3.删除不需要显示在 url 的参数
|
||
* 4.使用 window.location.replace 跳转正确页面
|
||
*/
|
||
(function () {
|
||
// 获取 url 中的参数
|
||
const params = getQueryMap(location.href) as LoginResult;
|
||
const must = ["username", "roles", "accessToken"];
|
||
const mustLength = must.length;
|
||
if (Object.keys(params).length !== mustLength) return;
|
||
|
||
// url 参数满足 must 里的全部值,才判定为单点登录,避免非单点登录时刷新页面无限循环
|
||
let sso = [];
|
||
let start = 0;
|
||
|
||
while (start < mustLength) {
|
||
if (Object.keys(params).includes(must[start]) && sso.length <= mustLength) {
|
||
sso.push(must[start]);
|
||
} else {
|
||
sso = [];
|
||
}
|
||
start++;
|
||
}
|
||
|
||
if (sso.length === mustLength) {
|
||
// 判定为单点登录
|
||
|
||
// 清空本地旧信息
|
||
removeToken();
|
||
|
||
// 保存新信息到本地
|
||
setToken(params);
|
||
|
||
// 删除不需要显示在 url 的参数
|
||
delete params["roles"];
|
||
delete params["accessToken"];
|
||
|
||
const newUrl = `${location.origin}${location.pathname}${subBefore(
|
||
location.hash,
|
||
"?"
|
||
)}?${JSON.stringify(params)
|
||
.replace(/["{}]/g, "")
|
||
.replace(/:/g, "=")
|
||
.replace(/,/g, "&")}`;
|
||
|
||
// 替换历史记录项
|
||
window.location.replace(newUrl);
|
||
} else {
|
||
return;
|
||
}
|
||
})();
|