刷新token和token是否过时的操做都是由后端实现,前端只负责根据code的不一样状态来作不一样的操做:前端
1、判断token是否过时、失效ios
举例:通常响应状态码 code :0,表示请求成功。①响应状态码 code:10010表示token过时 ②响应状态码 code:10011 表示token无效。这些状态码都由你本身和后端的同窗一块儿定义。code等于10010和10011这两种状态都会跳转到登陆页,从新进行登陆并获取最新的token。axios
2、在必定时间内刷新token后端
为何须要刷新token?由于出于安全性的考虑,通常是一天或几个小时更新token,看项目须要。缓存
怎么实现?我和后端的同窗是这么定义的,在发送任何一次请求时,若是须要更新token,响应体中后端的同窗给我返回了token这个字段,token出如今了响应体中,说明这时候是须要刷新token的(其余非刷新token的请求时是没有token字段的),这时用localStorage保存最新token,自动覆盖掉原来旧的token,这样下次再调用新接口时用的就是最新的token了,这样用户也感知不到token更新的过程。安全
3、具体实现session
/** * 全局变量 和 设置 、配置等。。。 */ import axios from 'axios' // 引入axios import Storage from '@/assets/js/util/storage.js' // storage工具类,简单的封装 axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded' /* 请求拦截器 */ axios.interceptors.request.use(function (config) { // 每次请求时会从localStorage中获取token let token = Storage.localGet('token') if (token) { token = 'bearer' + ' ' + token.replace(/'|"/g, '') // 把token加入到默认请求参数中 config.headers.common['Authorization'] = token } return config }, function (error) { return Promise.reject(error) }) /* 响应拦截器 */ axios.interceptors.response.use(function (response) { // ①10010 token过时(30天) ②10011 token无效 if (response.data.code === 10010 || response.data.code === 10011) { Storage.localRemove('token') // 删除已经失效或过时的token(不删除也能够,由于登陆后覆盖) router.replace({ path: '/login' // 到登陆页从新获取token }) } else if (response.data.token) { // 判断token是否存在,若是存在说明须要更新token Storage.localSet('token', response.data.token) // 覆盖原来的token(默认一天刷新一次) } return response }, function (error) { return Promise.reject(error) })
缓存工具类 Storageapp
var Storage = { // ==================sessionsTorage设置缓存================ // 设置缓存 sessionSet: function (name, data) { sessionStorage.removeItem(name) sessionStorage.setItem(name, JSON.stringify(data)) }, // 获取缓存 sessionGet: function (name) { return JSON.parse(sessionStorage.getItem(name)) }, // 清除缓存 sessionRemove: function (name) { sessionStorage.removeItem(name) }, // ==================localStorage设置缓存================== // 设置缓存 localSet: function (name, data) { localStorage.removeItem(name) localStorage.setItem(name, JSON.stringify(data)) }, // 获取缓存 localGet: function (name) { return JSON.parse(localStorage.getItem(name)) }, // 清除缓存 localRemove: function (name) { localStorage.removeItem(name) } } export default Storage