自学内容网 自学内容网

umi实现页面无感刷新token

登录返回双token

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

    @PostMapping("/login")
    public R<LoginUserInfo> login(@RequestBody LoginParamDTO loginParamDTO) {
        //生成两个token
        String accessToken = JwtTokenUtil.createToken(JwtTokenUtil.ACCESS_TOKEN_EXP);
        String refreshToken = JwtTokenUtil.createToken(JwtTokenUtil.REFRESH_TOKEN_EXP);
        //返回其他权限信息
    }

自动携带accessToken

利用axios的请求拦截器,我们可以实现这个功能

axios.interceptors.request.use(
    function(config){
      config.headers = {...config.headers, Authorization : (!!sessionStorage.getItem("accessToken") ? sessionStorage.getItem("accessToken") : '')}
      return config;
    },
    function(error){
      message.error("系统异常,请稍后再试!")
      return Promise.reject(error)
    }
)

accessToken失效校验

利用axios的响应拦截器

//这个是设置响应拦截器的api,第一个成功回调,第二个失败回调
axios.interceptors.response.use(
    function(response){
      const {code,date,msg} = response.data;
      if (code === 401){
       //TODO 刷新token逻辑
      } else {
          //正常访问返回结果值
          return response;
      }
    },
    function(error){
        message.error("系统异常,请稍后再试!")
        return Promise.reject(error);
    }
)

refreshToken刷新accessToken

当业务请求头失效时,利用refreshToken刷新token

//这个是设置响应拦截器的api,第一个成功回调,第二个失败回调
axios.interceptors.response.use(
    function(response){
      const {code,date,msg} = response.data;
      if (code === 401){
        // 返回一个新的 Promise,确保重新发起的请求结果能够传递
        return refreshToken().then(refreshResp=>{
            //刷新token成功
            if (refreshResp?.code === 200){
            } 
        })
      } else {
          //正常访问返回结果值
          return response;
      }
    },
    function(error){
        message.error("系统异常,请稍后再试!")
        return Promise.reject(error);
    }
)

在这里插入图片描述
第一次请求失败
在这里插入图片描述
使用refreshToken获取新的accessToken

在这里插入图片描述

业务接口的重试

业务接口请求失败后不应该立马返回,而是利用刷新后的token再次获取业务信息

在这里插入图片描述

//这个是设置响应拦截器的api,第一个成功回调,第二个失败回调
axios.interceptors.response.use(
    function(response){
      const {code,date,msg} = response.data;
      if (code === 401){
        // 返回一个新的 Promise,确保重新发起的请求结果能够传递(也就是传递给第一次的请求,而不是第二次的请求)
        return refreshToken().then(refreshResp=>{
            //刷新token成功
            if (refreshResp?.code === 200){
                sessionStorage.setItem("accessToken",refreshResp.data);
                // 使用原始请求的配置重新发起请求
                return axios.request(response.config);
            } 
        })
      } else {
          //正常访问返回结果值
          return response;
      }
    },
    function(error){
        message.error("系统异常,请稍后再试!")
        return Promise.reject(error);
    }
)

refreshToken的失效处理

当refreshToken失效后需要提示重新登录,并重定向到登陆界面

在这里插入图片描述

在这里插入图片描述

//这个是设置响应拦截器的api,第一个成功回调,第二个失败回调
axios.interceptors.response.use(
    function(response){
      const {code,date,msg} = response.data;
      if (code === 401){
        // 返回一个新的 Promise,确保重新发起的请求结果能够传递
        return refreshToken().then(refreshResp=>{
            //刷新token成功
            if (refreshResp?.code === 200){
                sessionStorage.setItem("accessToken",refreshResp.data);
                // 使用原始请求的配置重新发起请求
                return axios.request(response.config);
            } else if (refreshResp?.code === 601){
                //方式1
                message.info("登录状态失效,重新登录");
                setTimeout(() => {
                    clearAccessToken();
                    window.location.href = getLoginUrl();
                    return Promise.reject(new Error('Token refresh failed'));
                }, 2000); // 2秒后重定向

                //方式2
                // alert("登录状态失效,重新登录");
                // //清除消息
                // clearAccessToken();
                // window.location.href = getLoginUrl();
                // return Promise.reject(new Error('Token refresh failed'));
            }
        })
      } else {
          //正常访问返回结果值
          return response;
      }
    },
    function(error){
        message.error("系统异常,请稍后再试!")
        return Promise.reject(error);
    }
)


原文地址:https://blog.csdn.net/qq_44462054/article/details/144431209

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!