说明:
首先token是一定会失效的,至于什么时候失效,这个是由后端的人来决定的<br /> 我们调用接口的时候,携带token,服务器发现我们token是失效的,那么就会给我们一个约定好的状态码,就是如果token失效了就告诉我们一个状态码 (比如10002) 这里的10002只是用来举例子,具体要看后端约定的什么值<br />模拟token失效: 在vuex里面故意把token改坏掉,再次发送请求就会出现token失效,:
小总结:
后端:收到用户访问某个接口时,检查当前token是否失效,如果token已经失效,返给前端一<br /> 个约定好的状态码 **10002**<br /> 前端:在**响应拦截器**中,分析接口的返回值,如果状态码为10002, 则进行token失效操作
那么我们如何去处理呢token失效呢?
只要后端一报错还报的是10002的错,前端就知道是401 ,就可以在响应拦截器里面处理401错误,补充自定义的逻辑(如果犯的错误是10002 就要搞token失效)
要注意一点: token失效不代表没有token.如果你写了路由守卫功能的’如果有token就不能去登录页这个功能的话,’ 那你得先把token删除才能跳到登录页,不然一直跳不过去的
解释说明:
// 引入路由import router from '@/router'// 响应拦截器中// 1. 根据后端返回数据判断本次操作是否成功,不成功主动报错// 2. 如果成功,只返回有效数据service.interceptors.response.use(response => {// 后端和前端的约定:success=true表示请求成功if (response.data.success) {return response.data} else {// 如果success为false 业务出错,直接触发reject// 被catch分支捕获return Promise.reject(new Error(response.data.message))}},--------> token失效响应拦截器的处理:async error => {console.log('请求出错啦', error)if (error.response.data.code === 10002) { // 这里的10002根据后端给我们的状态码来写console.log('token失效')这里要做的事情就是删除token以及删除用户信息 这个思路是固定的await store.dispatch('user/logout') // 调用actions(内容不是固定的)// .vue -- this.$route.fullPath// .js -- router.currentRoute.fullPath// token失效跳转到login让它登录,登录成功又跳回目标页面router.push('/login?return_url=' + encodeURIComponent(router.currentRoute.fullPath))}console.dir(error)return Promise.reject(error)})
以上方案为后端主导的方案,前端只需要拿到错误码做业务处理即可,此方案也是常用且安全的最优方案
