如何从拦截器更新 axios 默认标头

  • 本文关键字:axios 默认 更新 vue.js axios
  • 更新时间 :
  • 英文 :


我有以下代码刷新JWT身份验证令牌:

axios.defaults.headers.common["Authorization"] = 'Bearer ' + jwt.getToken();
axios.interceptors.request.use((config) => {
  let originalRequest = config
  if (jwt.isTokenExpired() && api.unauthPaths.indexOf(config.url) == -1) {
    return api.refreshToken()
      .then(res => {
        if (res.data.error == 'TOKEN_BLACKLISTED' && res.headers.authorization) {
          let token = res.headers.authorization.slice(7)
          console.log(`Current token: ${ axios.defaults.headers.common["Authorization"]}`)
          axios.defaults.headers.common["Authorization"] = 'Bearer ' + token;
          //in this log token is new, but each next request uses the old token
          console.log(`New token: ${ axios.defaults.headers.common["Authorization"]}`)
          alert('token was refreshed')
          return Promise.resolve(originalRequest)
        } else {
          jwt.destroyToken()
          jwt.destroyExpiredTime()
          store.dispatch('auth/destroyToken')
          router.push({name: 'login'})
          return Promise.reject()
        }
      })
  }
  return config
}, (err) => {
  return Promise.reject(err)
})

当我从服务器获得新令牌时,我需要更新令牌。但是当我使用

axios.defaults.headers.common["Authorization"] = 'Bearer ' + token; 

在上面的代码中,axios 不会将默认令牌更改为 new。每个下一个请求都附带一个旧令牌。如何从 axios 拦截器设置新令牌?

您可能已经修复了此问题。但对于同样面临这个问题的人来说,这里是解决方案:

如果这是您的原始请求。 它还使用原始标头

const originalRequest = error.config

收到新令牌时,您必须更改它们:

originalRequest.headers.Authorization = `Bearer ${res.token}`

但是,您还必须为将来的调用再次设置默认标头:

axios.defaults.headers.common["Authorization"] = `Bearer ${res.token}`

最新更新