前端axios拦截器配合后端实现token刷新流程

以下内容作为自己学习笔记,仅供参考

axios拦截器代码地址:https://github.com/axios/axios?tab=readme-ov-file#interceptors

login页面提交表单,访问接口‘/adminapi/user/login’

axios.post("/adminapi/user/login",loginForm).then(res=>{
                if(res.data.ActionType === "OK"){
                    store.commit("changeUserInfo",res.data.data)
                    router.push("/index")
                }else{
                    ElMessage.error('用户名和密码不匹配')
                }
            })

后端收到请求,建立时效性token并回复给前端

    login:async (req,res)=>{
        var result = await UserService.login(req.body)

        if(result.length === 0){
            res.send({
                code:"-1",
                error:"用户名密码不匹配"
            })
        }else{
            const token = JWT.generate({
                _id:result[0]._id,
                username:result[0].username
            },"1d")
            res.header("Authorization",token)
            res.send({
                ActionType:"OK",
                data:{
                    username:result[0].username,
                    gender:result[0].gender ? result[0].gender : 0,
                    introduction:result[0].introduction,
                    avatar:result[0].avatar,
                    role:result[0].role //管理员:1 编辑:2
                }
            })
        }
    }

在axios拦截器处理token信息。上述后端发送回复,axios响应拦截器获取用户信息并存入到本地localStorage中。当访问其他页面,发送请求时,axios请求拦截器读取‘token’发送请求,后端处理请求。

import axios from "axios";
// Add a request interceptor
axios.interceptors.request.use(function (config) {
    // Do something before request is sent

    const token = localStorage.getItem("token")
    config.headers.Authorization = `Bearer ${token}`
    return config;    
  }, function (error) {
    // Do something with request error
    return Promise.reject(error);
  }); 

// Add a response interceptor
axios.interceptors.response.use(function (response) {
    // Any status code that lie within the range of 2xx cause this function to trigger
    // Do something with response data
    // console.log(response.headers)
    const {authorization} = response.headers
    authorization && localStorage.setItem("token",authorization)
    return response;
  }, function (error) {
    // Any status codes that falls outside the range of 2xx cause this function to trigger
    // Do something with response error

    const {status} = error.response
    if(status === 401){
        localStorage.removeItem("token")
        window.location.href = "#/login"
    }
    return Promise.reject(error);
  });

获取‘token’信息并验证,创建新的token信息(newToken)并回复前端。当过了时效期,刷新页面token被移除,跳转到 login 页面

app.use((req,res,next)=>{
  if(req.url === '/adminapi/user/login'){
    next() 
    return ;
  }
  const token = req.headers["authorization"].split(" ")[1]
  if(token){
    var payload = JWT.verify(token)
    if(payload){
      const newToken = JWT.generate({
        _id:payload._id,
        username:payload.username
      },"1d")
      res.header("Authorization",newToken)
      next() 
    }else{
      res.status(401).send({errCode:"-1",errorInfo:"token过期"})
    }
  }
})

  • 12
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
无感刷新token是指在前端发起请求时,如果当前的token已过期,则自动刷新token,并重新发起请求,达到用户无感知的效果。在axios中,可以通过拦截实现无感刷新token的功能。 在axios中,我们可以通过使用请求拦截和响应拦截实现无感刷新token的逻辑。首先,我们可以在请求拦截中判断当前的token是否已过期。如果token未过期,则直接返回请求对象,如果token已过期,则在请求拦截中发起刷新token的请求。 在刷新token的请求中,我们可以使用当前过期的token去请求后端接口,然后根据后端返回的结果来判断是否成功刷新token。如果刷新token成功,则将新的token更新到请求头信息中,并重新发起之前的请求。 在响应拦截中,我们可以判断后端返回的响应状态码。如果响应状态码为401,说明当前的token已过期,则调用刷新token的逻辑重新获取token,并再次发起请求。如果刷新token的请求失败,则说明用户的登录状态无效,可以跳转到登录页面重新登录。 通过以上的逻辑,我们可以实现无感刷新token的效果,用户不需要手动处理token过期的问题,从而提升用户体验。同时在后端也需要配合实现刷新token的逻辑,并提供相应的接口供前端调用。 无感刷新token实现涉及到了前后端配合前端通过axios拦截实现token的自动刷新后端提供相关的接口。通过这种方式,可以有效解决token过期后需要重新登录的问题,提升应用的用户体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值