最近在公司做一个vue.js的后台管理系统。鉴于自己也是vue小白,在网上查阅了很多现成的资料,总算是把需求搞定了。
先来介绍一下需求:登录时请求token和refresh_token(用来刷新token),每一次请求后端接口的时候都要在header里带token,如果过期会报错401,在过期的半小时内用refresh_token重新请求可以刷新token,使用户不必被强制退出重新登录。
这个项目使用的axios和vue-router,解决方法如下:
参考:http://blog.csdn.net/qq673318522/article/details/55506650
思路
axios设置的思路是,先设置默认的数据,比如说超时时间,url前缀,然后设置request和response拦截器,request拦截器是在发送请求之前执行,response拦截器是在请求返回之后执行。
这里实现刷新token主要是在response拦截器做文章,请求返回401时先记录这次请求的设置config,然后请求刷新接口,刷新成功之后再重新发送一次之前失败的请求,因为config保存下来,所以发送请求的时候可以先把config中的token换成最新的token,再直接用axios(config),而不用担心其他的设置,从而实现重新请求。
那么问题在于如何知道刷新token成不成功呢,如果无脑反复请求会变成死循环,因此需要设置一个变量在config中,请求过刷新接口之后设置这个变量为true,这样就不会重复刷新了。
代码
http.js内容如下:
import axios from 'axios'
import {Loading, Message} from 'element-ui'
import qs from 'qs';
import store from '../store/index'
import router from '../router/index'
// axios 配置
axios.defaults.timeout = 5000
axios.defaults.base