当前位置: 首页 > news >正文

Token无感刷新

token是有时效时间的,存在一种情况:表单提交,不知道用户要提交多久时间,可能会有填了一个小时刚写完结果点击提交回到登录页面了。

为提升用户体验——token无感刷新

登录的时候返回短token(失效时间短)

401代表短token失效

请求拦截器:

service.interceptors.request.use(
  function (config) {
    // 对非登录和刷新Token的请求,添加Authorization头
    if (config.url !== "/login") {
      config.headers["Authorization"] = `Bearer ${localStorage.getItem("token")}`;
    }
    // 对刷新Token的请求,使用refresh_token
    if (config.url === "/refresh_token") {
      config.headers["Authorization"] = `Bearer ${localStorage.getItem("refresh_token")}`;
    }
    return config;
  },
  function (error) {
    return Promise.reject(error);
  }
);
config.headers["Authorization"]意思是添加到请求头的Authorization字段中,格式为Bearer <token>

响应拦截器:

service.interceptors.response.use(
  async function (response) {
    // 成功响应:保存新的 Token 和 Refresh Token
    if (response.data.code === 0) {
      response.data.data.token && 
        localStorage.setItem("token", response.data.data.token);
      response.data.data.refresh_token && 
        localStorage.setItem("refresh_token", response.data.data.refresh_token);
      return response.data.data;
    } 
    // Token 过期(401 状态码)
    else if (response.data.code === 401) {
      // 尝试刷新 Token
      const res = await getRefresh();
      if (res) {
        // 用新 Token 重发原请求
        response.config.headers.Authorization = `Bearer ${localStorage.getItem("token")}`;
        const result = await service.request(response.config);
        return result;
      }
    }
  },
  function (error) {
    return Promise.reject(error);
  }
);

这个写法的意思是如果前面为true,就走后面的逻辑;如果前面为false,后面就不走了

类似于:

这是在请求刷新token的时候携带长接口,然后就能拿到最新的短token

然后表单再提交的时候就携带这个短token就行

在调用getRefresh也是接口请求,也会走上面这段,还会把最新的短token放到localStorage里

为什么不直接设置一个长token?还要设置一个短token?

token一直不变会有安全性问题

总结:

1.获取后端数据的时候,安全性是怎么保证的?

token认证

2.token认证的过程?描述一下

短token失效,就携带长token去请求新的短token,然后再提交表单的时候携带短token去请求

3.token认证的token是怎么携带的?

通过header携带

4.header携带的好处?是不是一定要放在header携带?

符合http标准、不放在url更安全

也可以放在cookie里,但是存在跨域问题

5.token无感刷新有听过吗?应用场景?简单说一说过程?

如上

相关文章:

  • 蓝桥杯备赛 Day 21 图论基础
  • 拼多多商品详情接口爬虫实战指南
  • 多线程代码案例(线程池)- 4
  • Rust 之四 运算符、标量、元组、数组、字符串、结构体、枚举
  • springboot Filter实现请求响应全链路拦截!完整日志监控方案​​
  • DeepSeek底层揭秘——《推理时Scaling方法》技术对比浅析
  • AI日报 - 2025年4月9日
  • 信息系统项目管理师-第十三章-项目资源管理
  • 2024 Jiangsu Collegiate Programming Contest H
  • 漫步·简单二进制
  • 基于STM32_HAL库的电动车报警器项目
  • 随机数据下的最短路问题(Dijstra优先队列)
  • golang通过飞书邮件服务API发送邮件功能详解
  • echart实现动态折线图(vue3+ts)
  • react的redux总结
  • telophoto源码查看记录
  • Nextjs15 实战 - React Notes CURD 实现
  • Dockerfile中CMD命令未生效
  • MyBatis的第四天学习笔记下
  • 动态规划算法深度解析:0-1背包问题(含完整流程)
  • 河南省委常委会会议:坚持以案为鉴,深刻汲取教训
  • 4月企业新发放贷款利率处于历史低位
  • 李强会见巴西总统卢拉
  • “水运江苏”“航运浙江”,江浙两省为何都在发力内河航运?
  • 外交部:中方愿根据当事方意愿,为化解乌克兰危机发挥建设性作用
  • 淡马锡辟谣:淡马锡和太白投资未在中国销售任何投资产品或金融工具