关于#小程序自定义token无感刷新#的问题,如何解决?

小程序自定义的token实现无感刷新
哪位盆友帮我把这段代码改造成可以实现token无感刷新的

const errorToast = function(msg) {
  wx.showToast({
    title: msg || "服务器繁忙,请稍后再试",
    icon: "none"
  })
}
export default function $mHttp (params) {


      wx.showLoading({
   title: params.load_txt || '加载中...',
    mask:params.mask || false
  })
  
  return new Promise((resolve, reject) => {
    wx.request({
      url: params.url,
      data: params.data,
      header: params.header || {
        //"Content-Type": "application/x-www-form-urlencoded",
        "token": wx.getStorageSync("token"),
        "uid": (new Date()).getTime() + '_' + Math.floor(Math.random() * 100000000) //接口请求流水号
      },
      method:  params.method ||'POST' ,
      success: function (res) {
        wx.hideLoading()
        var data = res.data;        
        resolve(data)
      },
      fail: function (e) {
        wx.showModal({
          content: '出现错误:'+e.errMsg
        })
        errorToast();
        reject(e)
      }
    })
  })
}


参考GPT和自己的思路:关于小程序自定义token无感刷新的问题,可以考虑在发送请求之前检查token是否快过期,如果快过期则重新获取新的token,并将新token存储到缓存中替换旧的token。具体实现可以在请求之前添加拦截器,在拦截器中进行检查和更新。

以下是一个示例代码:

// 添加拦截器
wx.interceptors.request.use(config => {
  // 判断token是否快过期,需要自行根据token过期时间来判断
  if (tokenAlmostExpired()) {
    // 发送请求获取新的token,并替换当前的token
    return refreshToken().then(newToken => {
      config.header.token = newToken;
      return Promise.resolve(config);
    });
  } else {
    return Promise.resolve(config);
  }
});

export default function $mHttp(params) {
  wx.showLoading({
    title: params.load_txt || '加载中...',
    mask: params.mask || false
  });

  return new Promise((resolve, reject) => {
    wx.request({
      url: params.url,
      data: params.data,
      header: {
        "token": wx.getStorageSync("token"),
        "uid": (new Date()).getTime() + '_' + Math.floor(Math.random() * 100000000) //接口请求流水号
      },
      method: params.method || 'POST',
      success: function(res) {
        wx.hideLoading();
        var data = res.data;
        resolve(data);
      },
      fail: function(e) {
        wx.showModal({
          content: '出现错误:' + e.errMsg
        });
        errorToast();
        reject(e);
      }
    });
  });
}

其中,tokenAlmostExpiredrefreshToken需要根据具体情况实现,分别用于判断当前的token是否即将过期和获取新的token。

  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/7772723
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:token过期后刷新token并重新发起请求
  • 除此之外, 这篇博客: 保存用户登录状态token,以及退出清除登录状态(node/后端设置token返回实现完整流程)中的 三.在登录成功进入个人中心页面时,进行传token来同步获取用户信息, 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 1)此时需要在个人中心页面携带token向后端接口发送请求
    
    //用户信息接口
    export const getUserInfo = (token)=>axios.get("/api/v1/pri/user/find_by_token",{
        params:{//请求头携带token传参,来获取后端对应用户信息(头像,名字等)
            "token":token
        }
    })
    

    2)在个人信息页面展示信息,并且有退出登录按钮进行退出

    <template>
    <div>
     <p>{{ info.name }}</p>
      <button v-if="getToken !== ''" class="green" @click="signOut">
          退出登录
       </button>
    </div>
    </template>
    <script>
    import { getUserInfo } from "@/api/getData.js";
    export default {
      data() {
        return {
          info: {},
        };
      },
    	//computed会有缓存功能,强调于属性的获取
      computed: {
      //从vuex中获取token
        getToken() {
          return this.$store.state.token;
        },
      },
    
      methods: {
        //获取用户信息
        async getInfo() {
          try {
            const result = await getUserInfo(this.getToken);
            if (result.data.code === 0) {
              this.info = result.data.data;
            }
          } catch (error) {
            console.log(error);
          }
        },
    
        //退出登录
        async signOut() {
          this.$createDialog({
            type: "confirm",
    
            title: "确认退出吗?",
    
            confirmBtn: {
              text: "确定按钮",
              active: true,
              disabled: false,
              href: "javascript:;",
            },
            cancelBtn: {
              text: "取消按钮",
              active: false,
              disabled: false,
              href: "javascript:;",
            },
            onConfirm: () => {
              this.$createToast({
                type: "warn",
                time: 1000,
                txt: "退出成功",
              }).show(
                
                this.$store.dispatch("clearToken"),
                //清除token
                localStorage.removeItem("token"),
                //刷新页面
                location.reload() 
              );
            },
          }).show();
        },
      },
    
      mounted() {
        if (this.getToken) {
          this.getInfo();
        }
      },
    };
    </script>
    
    

    到这里登录保存token以及退出清除token就实现了,在其他需要token的组件中只需要继续获取到vuex的token就可以获取到用户的信息了