前端双token无感刷新图文详解 |
|
1.双token的使用场景众所周知, 1.假如你正在访问某个平台,沉浸式的使用了一小时后却突然弹出一个token过期,重定向到了登录页… 2.假如你正在某网站里填写你的个人信息或者内容繁多的表单选项,填到一半的时候token过期了…提示需要重新登录,结果登录回来之后又要重新填写表单信息…T'T 3.假如你正在激情的抢票、蹲卡点秒杀活动!结果刚要抢购却因token过期被重定向到登录页… 是不是代入起来就已经很头疼了?那如何避免这种情况发生呢,接下来我们就引入今天的主角——无感刷新token 2.什么是token在介绍 token是一种用户标识,表示用户身份,类似于我们的身份证件 。 3.如何无感刷新token(图文+代码)当 目前比较常见的有三种方法:
在登录成功后,后端会返回两个 当需要访问API时,前端将从本地存储中获取 前端可以使用下面的代码实现刷新Token的操作: import axios from "axios";
import { getToken, setToken, setRefreshToken, getRefreshToken } from "./token";
import { ElMessage } from "element-plus";
import router from "@/router";
import { refreshToken } from "./refreshtoken";
const service = axios.create({
baseURL: "http://localhost:8087",
headers: {
Authorization: `Bearer ${getToken()}`,
},
});
// 添加请求拦截器
service.interceptors.request.use(
function (config) {
if (config.url === "/refresh_token") {
config.headers["Authorization"] = `Bearer ${getRefreshToken()}`;
}
// 在发送请求之前做些什么
return config;
},
function (error) {
// 对请求错误做些什么
return Promise.reject(error);
}
);
// 添加响应拦截器
service.interceptors.response.use(async (res) => {
// 1.第一次登录了以后 后台在header里面返回了短token 那么要先接收token存储到localstorage里面
if (res.headers.authorization) {
const token = res.headers.authorization.replace("Bearer ", "");
// 设置短token
setToken(token);
service.defaults.headers.Authorization = `Bearer ${token}`;
}
// 2. 第一次登录了以后 后台在header里面返回了长token 那么要先接受长token 存储到localstorage里面
if (res.headers.refreshtoken) {
const refreshtoken = res.headers.refreshtoken.replace("Bearer ", "");
// 设置长token
setRefreshToken(refreshtoken);
}
// 3 假设当后端返回401的时候 代表token失效 时间到了 这个时候正常处理就是跳到登录页面
// 但是在实际的业务场景的时候 用户体验非常不好
if (res.data.code === 401) {
// ElMessage({
// message: "token失效",
// type: "warning",
// });
// router.push("/login");
// 这个地方就是短token失效了 提交表单 不跳到登录页面 因为这样用户体验很不好
// 请求刚刚定义的一个接口
// 这个时候 提交表单的接口 还没提交 停在这里了 现在要干啥?请求
// 干啥了? 请求了changtoken携带过去 刷新token的接口
const success = await refreshToken();
if (success) {
res.config.headers.Authorization = `Bearer ${getToken()}`;
const result = await service.request(res.config);
return result;
}
}
return res.data;
});
function request(options) {
options.method = options.method || "get";
// 关于get请求参数的调整
if (options.method.toLowerCase() === "get") {
options.params = options.data;
}
return service(options);
}
export default request;
对应的 模拟网卡的时候,响应数据还没返回就重复刷新的情况:(本质就是借助Promise 。将请求存进队列中后,同时返回一个Promise,让这个Promise一直处于Pending状态(即不调用resolve),此时这个请求就会一直等啊等,只要我们不执行resolve,这个请求就会一直在等待 。当刷新请求的接口返回来后,我们再调用resolve,逐个重试 。)
将 使用 1)登录
2)业务请求
3)Token 过期,刷新 Token
现在,我们就已经成功实现了长短token的无感刷新啦! 一定要理解文章开头这张图的流程哦 总结到此这篇关于前端双token无感刷新的文章就介绍到这了,更多相关前端双token无感刷新内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持! |