生成时间: 2026-08-03 · 数据来源: xnybw平台需求及工作计划.xlsx(南网在线绿能云缺陷跟踪表)· 仅针对 backup730/730backup 分支代码

Row 44:项目信息查询偶尔会出现"未授权获取数据"的问题

一般 2.1.待开发 全部类型 模块:项目信息查询 处理人:待指派

1基本信息

问题描述偶尔会出现未授权获取数据的问题。
所属模块项目信息查询
严重程度一般
涉及类型全部类型
提出人刘向诚
处理人 / 状态待指派 / 2.1.待开发

2问题截图

401未授权提示
图1:在"电压等级/kV"筛选框选择"220kV"并查询后,页面顶部弹出两条错误提示——"未授权,请重新登录(401),请检查网络或联系管理员!"与"获取数据失败",列表区域显示"暂无数据"

3代码核查(backup730 分支)

关键发现(如实说明):在 xnybw5f 前端仓库 backup730 分支全文检索截图中出现的提示文案"未授权,请重新登录(401),请检查网络或联系管理员!",没有任何命中——该文案不是本仓库代码产生的。据此判断,这条 401 提示很可能来自宿主壳应用/网关层(该子应用以 qiankun 微前端形式被 newEnergySwTHWeb 门户壳加载,见 URL 中的 /business-page/newEnergySwTHWeb/... 前缀),即认证失败的统一提示是壳应用或 API 网关的全局响应拦截器加上去的,不在 xnybw5f 本身的代码范围内。

xnybw5f 本身能控制的部分:src/utils/request.js 第 40-115 行,axios 请求/响应拦截器:

service.interceptors.request.use(async (config) => {
  ...
  const authMode = getAuthMode()
  const token = getToken()
  if (token) {
    config.headers['Authorization'] = `Bearer ${token}`
    ...
  }
  return config
})

service.interceptors.response.use(
  (response) => { ... },
  (error) => {
    console.log(`err${error}`)
    Message({ message: error.message, type: 'error', duration: 5 * 1000 })
    return Promise.reject(error)
  }
)
本仓库范围内的根因说明:请求拦截器只是简单地把 getToken() 取到的 token 塞进 Authorization 头,没有任何 401 重试/刷新机制——响应拦截器收到错误(含 401)只是弹一条通用错误提示并 reject,既不会尝试静默刷新 token 再重发请求,也不会对"并发多个请求同时因 token 过期/尚未写入而失败"的场景做请求排队。这意味着如果根因是 token 处于"即将过期 / SSO 会话刚续期但本地还没来得及更新"的竞态窗口,xnybw5f 前端目前完全没有自愈能力,每一次落在这个窗口内的请求都会直接失败给用户看到"未授权",这与"偶尔"复现的现象吻合。

4修复方案

需要跨仓库协作确认:由于 401 提示文案由宿主壳应用/网关产生,建议先与门户壳/网关团队确认:该 401 是纯粹的"token 过期",还是"SSO 会话续期竞态""网关限流误判"等其它原因,以确定问题根本是否真的在 xnybw5f 侧。
xnybw5f 侧可独立完成的加固(无论根因在哪一侧,都建议补上):src/utils/request.js 的响应拦截器中为 401 增加"单次静默刷新 token + 重试"逻辑,并对并发请求做队列合并,避免同一时刻多个请求各自触发刷新:
let isRefreshing = false
let pendingQueue = []   // 401 期间到达的请求,等刷新完成后统一重放

service.interceptors.response.use(
  (response) => { ... },
  async (error) => {
    const { config, response } = error
    if (response && response.status === 401 && !config._retried) {
      if (!isRefreshing) {
        isRefreshing = true
        try {
          await refreshToken()          // 需要认证模块提供静默刷新能力
          pendingQueue.forEach(cb => cb())
          pendingQueue = []
        } catch (e) {
          pendingQueue = []
          Message({ message: '登录已过期,请重新登录', type: 'error' })
          redirectToLogin()
          return Promise.reject(error)
        } finally {
          isRefreshing = false
        }
      }
      return new Promise((resolve) => {
        pendingQueue.push(() => {
          config._retried = true
          resolve(service(config))
        })
      })
    }
    Message({ message: error.message, type: 'error', duration: 5 * 1000 })
    return Promise.reject(error)
  }
)
效果:即使根因确认在宿主壳/网关侧,xnybw5f 增加"401 静默刷新 + 请求排队重试"后也能大幅降低"偶尔弹出未授权"对用户的实际打扰,把纯粹的 token 过期型 401 在用户无感知的情况下自动恢复;若排查后确认是本仓库以外的问题,本次加固仍是有效的防御性改造,不会是无用功。