| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859 |
- import { removeToken, setToken, type DataInfo } from "./auth";
- import { subBefore, getQueryMap } from "@pureadmin/utils";
- /**
- * 简版前端单点登录,根据实际业务自行编写,平台启动后本地可以跳后面这个链接进行测试 http://localhost:8848/#/permission/page/index?username=sso&roles=admin&accessToken=eyJhbGciOiJIUzUxMiJ9.admin
- * 划重点:
- * 判断是否为单点登录,不为则直接返回不再进行任何逻辑处理,下面是单点登录后的逻辑处理
- * 1.清空本地旧信息;
- * 2.获取url中的重要参数信息,然后通过 setToken 保存在本地;
- * 3.删除不需要显示在 url 的参数
- * 4.使用 window.location.replace 跳转正确页面
- */
- (function () {
- // 获取 url 中的参数
- const params = getQueryMap(location.href) as DataInfo<Date>;
- 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;
- }
- })();
|