vue2实现无感刷新token

拼搏现实的明天。 2024-04-21 08:12 126阅读 0赞

f32d52385fe74f818938a999e6ba42a4.png

? 江城开朗的豌豆:个人主页

? 个人专栏 :《 VUE 》 《 javaScript 》

? 个人网站 :《 江城开朗的豌豆? 》

⛺️ 生活的理想,就是为了理想的生活 !

在这里插入图片描述

目录

? 引言:

? 安装依赖

? 创建 Axios 实例并做请求封装

? 使用封装的 Axios 实例

? 写在最后


? 引言:

在 Web 应用中,用户需要通过认证和授权才能访问受保护的资源。为了实现认证和授权功能,通常需要使用 Token 来标识用户身份并验证其权限。但是,Token 有时限制其有效期,以确保安全性。

当 Token 过期时,应用程序会返回一个 401(未授权)错误,提示用户重新登录或刷新页面。这可能会影响用户体验和流程,并可能导致应用程序的性能问题。

因此,为了提高应用程序的用户体验和可靠性,通常会使用无感刷新 Token 的技术来自动刷新过期的 Token。这样,即使 Token 过期,用户也可以继续使用应用程序而不会收到任何干扰。此外,无感刷新 Token 还可以提高应用程序的安全性和稳定性,因为它可以有效地防止 Token 被恶意利用或攻击。

需要注意的是,在实现无感刷新 Token 的过程中,需要注意保护用户数据的安全性,并遵守相关的安全标准和法律法规。同时,还需要根据应用程序的需求和后端接口的设计来调整具体的实现方式。

? 安装依赖

现在我们开始写入vue2前端代码

首先,确保已经安装了 Axios 和相关的依赖。

  1. npm install axios

? 创建 Axios 实例并做请求封装

src/utils/request.js 文件中创建一个 Axios 实例,并进行相关配置。

  1. import axios from "axios";
  2. const service = axios.create({
  3. baseURL:
  4. process.env.NODE_ENV !== "production"
  5. ? process.env.VUE_APP_BASE_API
  6. : process.env.VUE_APP_BASE_API_RUL,
  7. timeout: 10000, // 超时时间
  8. });
  9. // request 拦截器
  10. // 可以自请求发送前对请求做一些处理
  11. // 比如统一加token,对请求参数统一加密
  12. service.interceptors.request.use(
  13. (config) => {
  14. const token = window.localStorage.getItem("token");
  15. token && (config.headers.Authorization = token);
  16. config.headers["Content-Type"] = "application/json;charset=utf-8";
  17. config.headers["Authorization"] = "Bearer " + token; // 设置请求头
  18. return config;
  19. },
  20. (error) => {
  21. return Promise.reject("网络异常,请稍后再试" + error);
  22. }
  23. );
  24. // response 拦截器
  25. // 可以在接口响应后统一处理结果
  26. service.interceptors.response.use(
  27. (response) => {
  28. if (response.data.code == 401) {
  29. let userInfo = {};
  30. userInfo.account = process.env.VUE_APP_TOKEN.split(",")[0];
  31. userInfo.password = process.env.VUE_APP_TOKEN.split(",")[1];
  32. // 这里需要调用登录接口,重新获取token
  33. return refreshToken(userInfo).then((newToken) => {
  34. // 更新本地存储的 Token
  35. localStorage.setItem("token", newToken);
  36. // 重新发送原请求
  37. return service(response.config);
  38. });
  39. }
  40. let res = response.data;
  41. // 兼容服务端返回的字符串数据
  42. if (typeof res === "string") {
  43. res = res ? JSON.parse(res) : res;
  44. }
  45. return res;
  46. },
  47. (error) => {
  48. return Promise.reject("网络异常,请稍后再试" + error);
  49. }
  50. );
  51. function refreshToken(userInfo) {
  52. return new Promise((resolve, reject) => {
  53. // 调用登录接口重新获取 Token
  54. axios
  55. .post(`${process.env.VUE_APP_BASE_API}/pc_admin/login`, {
  56. ...userInfo,
  57. })
  58. .then((response) => {
  59. resolve(response.data.data.token);
  60. })
  61. .catch((error) => {
  62. reject(error);
  63. });
  64. });
  65. }
  66. export default service;

? 使用封装的 Axios 实例

在需要发送请求的地方引入封装的 Axios 实例,并使用它来发送请求。

  1. //sever.js
  2. import request from "./http";
  3. // 测试接口
  4. export function getListApi(params) {
  5. return request({
  6. url: "/pc_admin/article",
  7. method: "get",
  8. params: params,
  9. });
  10. }

? 写在最后

通过上述代码,在使用 Axios 发送请求时,会自动处理 Token 过期的情况,并进行无感刷新 Token。这样可以提高应用程序的用户体验和安全性。

请大家不吝赐教,在下方评论或者私信我,十分感谢???.

✅ 认为我某个部分的设计过于繁琐,有更加简单或者更高逼格的封装方式

✅ 认为我部分代码过于老旧,可以提供新的API或最新语法

✅ 对于文章中部分内容不理解

✅ 解答我文章中一些疑问

✅ 认为某些交互,功能需要优化,发现BUG

✅ 想要添加新功能,对于整体的设计,外观有更好的建议

最后感谢各位的耐心观看,既然都到这了,点个 ?赞再走吧!

637c19f99c8c4f7dab6d610483f35438.gif

发表评论

表情:
评论列表 (有 0 条评论,126人围观)

还没有评论,来说两句吧...

相关阅读