提交 1f4d2a52 authored 作者: 詹银鑫's avatar 詹银鑫

feat: token刷新更新

上级 520c88d8
...@@ -47,11 +47,11 @@ export function getToken(): DataInfo<number> { ...@@ -47,11 +47,11 @@ export function getToken(): DataInfo<number> {
* 将`accessToken`、`expires`、`refreshToken`这三条信息放在key值为authorized-token的cookie里(过期自动销毁) * 将`accessToken`、`expires`、`refreshToken`这三条信息放在key值为authorized-token的cookie里(过期自动销毁)
* 将`avatar`、`username`、`nickname`、`roles`、`permissions`、`refreshToken`、`expires`这七条信息放在key值为`user-info`的localStorage里(利用`multipleTabsKey`当浏览器完全关闭后自动销毁) * 将`avatar`、`username`、`nickname`、`roles`、`permissions`、`refreshToken`、`expires`这七条信息放在key值为`user-info`的localStorage里(利用`multipleTabsKey`当浏览器完全关闭后自动销毁)
*/ */
export function setToken(data: DataInfo<Date>) { export function setToken(data: DataInfo<number>) {
let expires = 0; let expires = 0;
const { accessToken, refreshToken } = data; const { accessToken, refreshToken } = data;
const { isRemembered, loginDay } = useUserStoreHook(); const { isRemembered, loginDay } = useUserStoreHook();
expires = new Date(data.expires).getTime(); // 如果后端直接设置时间戳,将此处代码改为expires = data.expires,然后把上面的DataInfo<Date>改成DataInfo<number>即可 expires = data.expires; // 如果后端直接设置时间戳,将此处代码改为expires = data.expires,然后把上面的DataInfo<Date>改成DataInfo<number>即可
const cookieString = JSON.stringify({ accessToken, expires, refreshToken }); const cookieString = JSON.stringify({ accessToken, expires, refreshToken });
expires > 0 expires > 0
......
...@@ -82,7 +82,6 @@ class PureHttp { ...@@ -82,7 +82,6 @@ class PureHttp {
const data = getToken(); const data = getToken();
if (data) { if (data) {
const now = new Date().getTime(); const now = new Date().getTime();
console.log("time", parseInt(data.expires) - now);
const expired = parseInt(data.expires) - now <= 0; const expired = parseInt(data.expires) - now <= 0;
if (expired) { if (expired) {
if (!PureHttp.isRefreshing) { if (!PureHttp.isRefreshing) {
...@@ -138,63 +137,7 @@ class PureHttp { ...@@ -138,63 +137,7 @@ class PureHttp {
return response.data; return response.data;
}, },
(error: PureHttpError) => { (error: PureHttpError) => {
// A0301 TOKEN错误 A0201
const $error = error; const $error = error;
if (($error.response.data as { code: string })?.code === "A0301") {
/** 请求白名单,放置一些不需要`token`的接口(通过设置请求白名单,防止`token`过期后再请求造成的死循环问题) */
console.log("error", $error.config);
const whiteList = ["/refresh-token", "/login"];
return whiteList.some(url => $error.config.url.endsWith(url))
? $error.config
: new Promise(() => {
const data = getToken();
if (data) {
if (!PureHttp.isRefreshing) {
PureHttp.isRefreshing = true;
// token过期刷新
useUserStoreHook()
.handRefreshToken({
refreshToken: data.refreshToken
})
.then(res => {
console.log("res", res);
const token = res.data.jwt;
// let refreshToken = res.data.refreshToken;
// console.log("token", token);
$error.config.headers["Authorization"] =
formatToken(token);
// 遍历并执行存储的回调函数
PureHttp.requests.forEach(cb => cb(token));
PureHttp.requests = []; // 清空队列
// 重新发起原始请求
return PureHttp.axiosInstance.request($error.config);
// PureHttp.retryOriginalRequest($error.config);
// PureHttp.requests.forEach(cb => {
// console.log("cb", cb);
// cb(token);
// });
// PureHttp.requests = [];
})
.finally(() => {
PureHttp.isRefreshing = false;
});
// }
// resolve());
// } else {
// config.headers["Authorization"] = formatToken(
// data.accessToken
// );
// resolve(config);
// }
// } else {
// resolve(config);
}
}
});
}
$error.isCancelRequest = Axios.isCancel($error); $error.isCancelRequest = Axios.isCancel($error);
// 关闭进度条动画 // 关闭进度条动画
NProgress.done(); NProgress.done();
......
...@@ -137,12 +137,13 @@ const onLogin = async (formEl: FormInstance | undefined) => { ...@@ -137,12 +137,13 @@ const onLogin = async (formEl: FormInstance | undefined) => {
.then(res => { .then(res => {
if (res.status === 200 || res.success) { if (res.status === 200 || res.success) {
// 登录成功,设置 token // 登录成功,设置 token
console.log("res", res.data.refreshToken); debugger;
console.log("res", res);
setToken({ setToken({
// accessToken: res.data.jwt, accessToken: res.data.jwt,
accessToken: "1213123",
refreshToken: res.data.refreshToken, refreshToken: res.data.refreshToken,
expires: new Date(Date.now() + 9999999 * 1000) expires: res.data.expires
// expires: new Date(Date.now() + 9999999 * 1000)
}); });
console.log("getToken", getToken); console.log("getToken", getToken);
// 初始化路由 // 初始化路由
...@@ -152,7 +153,6 @@ const onLogin = async (formEl: FormInstance | undefined) => { ...@@ -152,7 +153,6 @@ const onLogin = async (formEl: FormInstance | undefined) => {
router router
.push(getTopMenu(true).path) .push(getTopMenu(true).path)
.then(() => { .then(() => {
debugger;
// 显示登录成功消息 // 显示登录成功消息
message(t("login.pureLoginSuccess"), { type: "success" }); message(t("login.pureLoginSuccess"), { type: "success" });
}) })
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论