VUE项目中,当token过期之后怎样自动跳转到登录页面

我们在做项尤其是后台项目。都会涉及到登录。我们一般是用token来设置项目的登录状态。token的有效时长,根据自身的项目需求来设定,而当token过期之后,我们就需要使得整个项目页面自动跳转到登录页面,去让用户重新登录。

例如: 我公司的token时效在生产环境设置为一个小时,当token过期,所有接口都直接返回;每次路由跳转都会对token进行判断,设置了一个全局的beforeEach钩子函数,如果token存在就跳到你所需要的页面,否则就直接跳转到登录页面,让用户登录重新存取token:

接口返回的信息
{
	code:10009,
	msg:'token过期',
	data:null
}
全局的路由钩子函数
router.beforeEach(async(to, from, next) => {
//获取token
  // determine whether the user has logged in
  const hasToken = getToken()

  if (hasToken) {
  //token存在,如果当前跳转的路由是登录界面
    if (to.path === '/login') {
      // if is logged in, redirect to the home page
      next({ path: '/' })
      NProgress.done()
    } else {
    //在这里,就拉去用户权限,判断用户是否有权限访问这个路由
    } catch (error) {
          // remove token and go to login page to re-login
          await store.dispatch('user/resetToken')
          Message.error(error || 'Has Error')
          next(`/login?redirect=${to.path}`)
          NProgress.done()
        }
  } else {
    //token不存在
    if (whiteList.indexOf(to.path) !== -1) {
    //如果要跳转的路由在白名单里,则跳转过去
      next()
    } else {
    //否则跳转到登录页面
      next(`/login?redirect=${to.path}`)
      NProgress.done()
    }
  }
})

所以我直接在对所有的请求进行拦截,当响应的数据返回的code是10009,就直接清空用户信息,重新加载页面。我对代码简化了下,因为用户在登录时就会把token,name以及权限信息存在store/user.js文件里,所以只要token过期,把user文件的信息清空。这样,在token过期后,刷新页面或者跳转组件时,都会调用全局的beforeEach判断,当token信息不存在就会直接跳转到登录页面

import axios from 'axios'
import { MessageBox, Message } from 'element-ui'
import store from '@/store'
import { getToken } from '@/utils/auth'

const service = axios.create({
  baseURL: process.env.VUE_APP_BASE_API, 
  timeout: 5000 
})
//发送请求时把token携带过去
service.interceptors.request.use(
  config => {
    if (store.getters.token) {
      config.headers['sg-token'] = getToken()
    }
    return config
  },
  error => {
    console.log(error)
    return Promise.reject(error)
  }
)

service.interceptors.response.use(
  response => {
    console.log(response.data)
    const res = response.data

    // token过期,重返登录界面
    if (res.code === 10009) {
      store.dispatch('user/logout').then(() => {
        location.reload(true)
      })
    }
    return res
  },
  error => {
    console.log('err' + error) // for debug
    Message({
      message: error.msg,
      type: 'error',
      duration: 5 * 1000
    })
    return Promise.reject(error)
  }
)

export default service

Vue 2,可以使用axios拦截器来统一处理接口响应的登录失效的数据,并实现跳转登录页面的功能。 首先,需要安装axios,可以通过以下命令进行安装: ``` npm install axios --save ``` 接下来,在你的项目创建一个`api`文件夹,并在其新建一个`http.js`文件。在该文件,引入axios并进行一些配置,如下所示: ```javascript // api/http.js import axios from 'axios'; // 创建axios实例 const http = axios.create({ baseURL: 'http://your-api-base-url.com', // 设置接口请求的基础URL timeout: 5000 // 设置超时时间 }); // 请求拦截器 http.interceptors.request.use( config => { // 在发送请求之前可以进行一些处理,例如添加请求头等 // config.headers['Authorization'] = 'Bearer ' + token; return config; }, error => { return Promise.reject(error); } ); // 响应拦截器 http.interceptors.response.use( response => { // 在接收到响应数据之后可以进行一些处理,例如判断登录失效等 return response.data; }, error => { // 处理响应错误 if (error.response && error.response.status === 401) { // 登录失效,跳转登录页面 window.location.href = '/login'; } return Promise.reject(error); } ); export default http; ``` 在这个文件,我们创建了一个axios实例,并在其定义了请求拦截器和响应拦截器。在请求拦截器,你可以进行一些请求相关的处理,例如添加请求头等;在响应拦截器,我们判断了响应状态码是否为401,如果是,则表示登录失效,将会跳转登录页面。 接下来,在需要发起接口请求的地方,将使用到这个axios实例。例如,在一个`userService.js`文件,我们定义了一个登录接口的方法: ```javascript // api/userService.js import http from '@/api/http'; export function login(username, password) { return http.post('/login', { username, password }); } ``` 在上述代码,我们通过`http`实例来发起请求。当登录接口返回401状态码时,拦截器会自动跳转登录页面。 请注意,以上代码只是一个示例,你需要根据你的实际情况进行相应的修改和调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值