vbenjs / vue-vben-admin

A modern vue admin panel built with Vue3, Shadcn UI, Vite, TypeScript, and Monorepo. It's fast!
https://www.vben.pro
MIT License
25.63k stars 6.98k forks source link

Bug: token过期后会死循环 #4826

Closed lovelyJason closed 4 weeks ago

lovelyJason commented 4 weeks ago

Version

Vben Admin V5

Describe the bug?

3945

image

跟这个问题一模一样,我后端返回来http状态码为200,data.code为401时会,在响应拦截器中

  client.addResponseInterceptor(
    errorMessageResponseInterceptor((msg: string, error) => {
      // 这里可以根据业务进行定制,你可以拿到 error 内的信息进行定制化处理,根据不同的 code 做不同的提示,而不是直接使用 message.error 提示 msg
      // 当前mock接口返回的错误字段是 error 或者 message
      const responseData = error?.response?.data ?? {};
      const errorMessage = responseData?.error ?? responseData?.message ?? '';
      // 如果没有错误信息,则会根据状态码进行提示
      message.error(errorMessage || msg);
      if (responseData .code === 401) {
         window.location.hash = '/auth/login'
      }
    }),
  );

然后会无限死循环,在登录页一直调getinfo接口

我如果不改代码的话,默认这个token过期刷新页面后页面直接空白了,啥也没有。这个bug还在

Reproduction

暂无

System Info

System:
    OS: Windows 10 10.0.19045
    CPU: (24) x64 13th Gen Intel(R) Core(TM) i7-13700
    Memory: 27.26 GB / 63.70 GB
  Binaries:
    Node: 20.15.0 - ~\AppData\Local\fnm_multishells\25468_1729582803829\node.EXE
    npm: 10.7.0 - ~\AppData\Local\fnm_multishells\25468_1729582803829\npm.CMD
    pnpm: 9.12.2 - ~\AppData\Local\fnm_multishells\25468_1729582803829\pnpm.CMD
  Browsers:
    Edge: Chromium (128.0.2739.63)
    Internet Explorer: 11.0.19041.4355

Relevant log output

No response

Validations

anncwb commented 4 weeks ago

你应该参考 status=401时的处理,这个问题已经修复了。

lovelyJason commented 3 weeks ago

你应该参考 status=401时的处理,这个问题已经修复了。

image

你说的是这地方吧,也不对哈, 我是5.4.2的版本,看了你github最新代码, 这个东西有一点问题。就是接口请求的http状态码所有全部是200, 当token过期时返回的{code: "401", msg: "token is expired"}是在response.data里面。我即使改了后端把http状态码和data.code都变为401,还是不得行哈,页面会空白,控制台报{code: 401, msg: "token is expired"}路由注册失败。这个问题还是在的哈

我把

      // 如果不是 401 错误,直接抛出异常
      if (response?.status !== 401) {
        throw error;
      }

改成了

      // 如果不是 401 错误,直接抛出异常
      if (response?.data.code!== 401) {
        throw error;
      }

再页面上点击接口请求的按钮,报401,此时系统无任何回馈,我认为应该是要做两件事:1.清空localstorage里面的vben-web-antd-5.4.2-dev-core-access,这里存储着accessTOken。 2:重定向到/auth/login页面

然后紧接着一个问题就是此时刷新页面,刚才还能看到界面,现在全屏空白,进度条一直在转

image

dansh但是我又不敢在这里面直接window.location.href = '/auth/login',经测试,在login页一直无限循环调getinfo接口,很是头疼

lovelyJason commented 3 weeks ago

你应该参考 status=401时的处理,这个问题已经修复了。

image

你说的是这地方吧,也不对哈, 我是5.4.2的版本,看了你github最新代码, 这个东西有一点问题。就是接口请求的http状态码所有全部是200, 当token过期时返回的{code: "401", msg: "token is expired"}是在response.data里面。我即使改了后端把http状态码和data.code都变为401,还是不得行哈,页面会空白,控制台报{code: 401, msg: "token is expired"}路由注册失败。这个问题还是在的哈

我把

      // 如果不是 401 错误,直接抛出异常
      if (response?.status !== 401) {
        throw error;
      }

改成了

      // 如果不是 401 错误,直接抛出异常
      if (response?.data.code!== 401) {
        throw error;
      }

再页面上点击接口请求的按钮,报401,此时系统无任何回馈,我认为应该是要做两件事:1.清空localstorage里面的vben-web-antd-5.4.2-dev-core-access,这里存储着accessTOken。 2:重定向到/auth/login页面

然后紧接着一个问题就是此时刷新页面,刚才还能看到界面,现在全屏空白,进度条一直在转

image

dansh但是我又不敢在这里面直接window.location.href = '/auth/login',经测试,在login页一直无限循环调getinfo接口,很是头疼

同时也会无限循环调logout接口,然后logout返回http200, {code: 401}, 这里抛错了,又继续无限循环调logout

lovelyJason commented 3 weeks ago

而且另外提一嘴,对于不需要token过期重试的行为时,如图片所示,这段代码要注释掉,另外,在拦截器里得把token清空掉,pinia的插件会连带着把localsrorage里面的token也清掉,这样刷新页面才不会出问题

image

ZongYan30 commented 3 weeks ago

是的,我也遇到了这个情况。

Snipaste_2024-11-07_11-55-54
lovelyJason commented 3 weeks ago

是的,我也遇到了这个情况。 Snipaste_2024-11-07_11-55-54

哎,所以就不懂,这个最新代码bug本来就是存在的,作者为啥要关闭这个issue