Skip to content

关于 axios 302 重定向的问题

TODO

1. 检查响应数据类型

在你的响应拦截器中,首先检查响应的数据类型。如果响应的数据是 HTML,而不是 JSON,那么很可能是登录重定向页面:

typescript
instance.interceptors.response.use(
  (response) => {
    if (
      response.headers['content-type'] &&
      response.headers['content-type'].includes('text/html')
    ) {
      // 处理HTML响应
      handleHtmlResponse(response)
    } else {
      return handleData(response)
    }
  },
  (error) => {
    // 错误处理
    return handleData(error.response)
  }
)

function handleHtmlResponse(response: any) {
  const { config } = response
  // 在这里你可以处理登录重定向逻辑,比如重定向到登录页
  router.push({ path: '/login', replace: true }).then(() => {
    console.log('重定向到登录页')
  })
  return Promise.reject('需要登录')
}

2. 使用拦截器检测和处理重定向

如果服务器返回 302 重定向状态码,你可以在响应拦截器中专门处理这种情况:

typescript
instance.interceptors.response.use(
  (response) => {
    if (response.status === 302) {
      const redirectUrl = response.headers['location']
      if (redirectUrl) {
        window.location.href = redirectUrl
      } else {
        console.error('重定向 URL 未找到')
      }
      return Promise.reject('重定向')
    }
    return handleData(response)
  },
  (error) => {
    return handleData(error.response)
  }
)

3. 检查是否需要重新登录

handleData 函数中处理 401 状态码时,确保正确地处理需要重新登录的情况:

typescript
const handleData = async ({ config, data, status, statusText }: any) => {
  const { resetAll } = useUserStore()
  if (loadingInstance) loadingInstance.close()
  let code = data && data[statusName] ? data[statusName] : status
  switch (code) {
    case 200:
      return data
    case 401:
      router.push({ path: '/login', replace: true }).then(() => {
        resetAll()
      })
      break
    case 402:
      return await tryRefreshToken(config)
    case 403:
      router.push({ path: '/403' }).then(() => {})
      break
    default:
      const errMsg = `${
        data && data[messageName]
          ? data[messageName]
          : CODE_MESSAGE[code]
          ? CODE_MESSAGE[code]
          : statusText
      }`
      gp.$baseMessage(errMsg, 'error', 'vab-hey-message-error', false)
      if (needErrorLog())
        addErrorLog({ message: errMsg, stack: data, isRequest: true })
      return Promise.reject(data)
  }
}