通过接口无痛刷新token

ts最简单的封装
import axios, {AxiosInstance, AxiosError, AxiosResponse, AxiosRequestConfig} from 'axios';

const service:AxiosInstance = axios.create({
    timeout: 5000
});

service.interceptors.request.use(
    (config: AxiosRequestConfig) => {
        return config;
    },
    (error: AxiosError) => {
        console.log(error);
        return Promise.reject();
    }
);

service.interceptors.response.use(
    (response: AxiosResponse) => {
        if (response.status === 200) {
            return response;
        } else {
            Promise.reject();
        }
    },
    (error: AxiosError) => {
        console.log(error);
        return Promise.reject();
    }
);

export default service;

使用

import request from '../utils/request';

export const fetchData = () => {
    return request({
        url: './table.json',
        method: 'get'
    });
};

//无痛刷新第一种方法:

import axios from 'axios'

// 是否正在刷新的标记
let isRefreshing = false
//重试队列
let requests = []
service.interceptors.response.use(
  response => {
  //约定code 409 token 过期
    if (response.data.code === 409) {
      if (!isRefreshing) {
        isRefreshing = true
        //调用刷新token的接口
        return refreshToken({ refreshToken: localStorage.getItem('refreshToken'), token: getToken() }).then(res => {
          const { token } = res.data
          // 替换token
          setToken(token)
          response.headers.Authorization = `${token}`
           // token 刷新后将数组的方法重新执行
          requests.forEach((cb) => cb(token))
          requests = [] // 重新请求完清空
          return service(response.config)
        }).catch(err => {
        //跳到登录页
          removeToken()
          router.push('/login')
          return Promise.reject(err)
        }).finally(() => {
          isRefreshing = false
        })
      } else {
        // 返回未执行 resolve 的 Promise
        return new Promise(resolve => {
          // 用函数形式将 resolve 存入,等待刷新后再执行
          requests.push(token => {
            response.headers.Authorization = `${token}`
            resolve(service(response.config))
          })
        })
      }
    }
    return response && response.data
  },
  (error) => {
    Message.error(error.response.data.msg)
    return Promise.reject(error)
  }
)




//无痛刷新第二种方法:




import axios from 'axios'

// 创建 axios 实例
const service = axios.create({
    // API 请求的默认前缀 (config中设置了代理,这里便不需要再配置)
    baseURL: '/',
    timeout: 3000 // 设置请求超时时间
})



/**
 * 刷新 access_token 的接口
 * 1.保存token
 * 2.重新发起请求
 * @param {*} config 
 * @returns 
 */
const refreshToken = (config) => {
    return service.post('/auth-service/auth-sys/refreshToken',{ refreshToken: localStorage.getItem("refreshToken") }).then(res=>{
        console.log(res)
        localStorage.setItem("accessToken",res)
        config.headers['X-Access-Token'] = localStorage.getItem("accessToken")
        return service(config)
    }).catch(err => {
        console.error(err)
    });
}




//请求拦截器
//在请求发送之前做一些处理
service.interceptors.request.use((config) => {
    config.headers['X-Access-Token'] = localStorage.getItem("accessToken")
    // console.log("请求拦截器,增加headers配置", config.headers)
    return config
}, (error) => {
    // console.log("请求失败:", error)
    return Promise.reject(error)
}
)

service.interceptors.response.use((response) => {
    var res = response.data;
    console.log("响应拦截器", response.data)
    if (res.code == 200) {
        return res.result;
    } else {//服务端返回的异常代码
        //token过期,需要刷新token
        if (res.code === 602) {
            return refreshToken(response.config);
        }
        //票据失效,需要重新登陆
        if (res.code === 603) {
            console.log("票据失效,需要重新登陆")
        }
        return Promise.reject(res)
    }
}, (error) => {
    //接口响应异常时,如404
    console.error(error.code, error.message)
    return Promise.reject(error)//返回请求结果,可在.then.catch中捕捉到
})

export default service

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Uniapp中,实现无痛刷新token可以通过以下步骤来完成。 首先,当用户登录后,服务器会返回一个access token和一个refresh token。access token通常具有较短的有效期,而refresh token具有较长的有效期。 接下来,在每次发起请求访问需要认证的接口时,前端都将携带access token在请求的header中进行认证。 当access token即将过期时,前端可以通过拦截请求的方式,判断access token的时间是否快要过期。 如果access token快要过期,前端会发送一个特殊的请求到服务器,携带refresh token请求刷新access token。 服务器收到刷新请求后,会验证refresh token的有效性。如果refresh token有效,则服务器会生成一个新的access token,并返回给前端前端在收到新的access token后,会将其存储起来,覆盖之前的旧token。 这样一来,前端就可以继续使用新的access token发起需要认证的请求,而无需用户重新登录。 需要注意的是,刷新token的过程需要保证请求的安全性,防止token被劫持或滥用。可以使用https协议来加密请求,避免信息泄露。 总结起来,Uniapp的无痛刷新token的实现主要依赖于refresh token机制。前端在判断access token即将过期时,发送刷新请求,服务器验证refresh token的有效性并生成新的access token前端将新的access token存储起来,继续使用新的token发起请求,从而实现无痛刷新token
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值