首页 > Web开发 > 详细

必备技能四、ajax及token

时间:2019-08-30 10:40:16      阅读:69      评论:0      收藏:0      [点我收藏+]

1.什么是Token 机制?

token的意思是“令牌”,是服务端生成的一串字符串,作为客户端进行请求的一个标识。 当用户第一次登录后,服务器生成一个Token并将此Token返回给客户端,在以后的请求过程中,需要将该Token作为参数或者放在header里面发送给服务器作为身份验证的一个步骤,无需再次带上用户名和密码,但是服务端每隔一段时间(比如30分钟)就会重新生成Token,这时候客户端再用本地缓存的旧Token去请求就无法通过身份认证,一般状态码都会是401。
 

vue项目中token失效处理方法,在main.js配置如下

//判断token失效跳转
axios.interceptors.response.use(response => {
    if (response) {
        switch (response.data.code) {

            case 1001: //与后台约定登录失效的返回码,根据实际情况处理
                sessionStorage.removeItem(‘uid‘);     //删除用户ID
                sessionStorage.removeItem(‘key‘);     //删除用户登录验证的key值,即token值
                router.replace({
                    path: ‘/Login‘,
                    query: {
                        redirect: router.currentRoute.fullPath
                    }
                })
        }
    }
    return response;
}, error => {

    return Promise.reject(error.response.data) //返回接口返回的错误信息
})

token失效后,需用户重新登录才可以继续访问管理后台 

 

 

 

刷新token和token是否过期的操作都是由后端实现,前端只负责根据code的不同状态来做不同的操作:

一、判断token是否过期、失效

举例:一般响应状态码 code :0,表示请求成功。①响应状态码 code:10010表示token过期 ②响应状态码 code:10011 表示token无效。这些状态码都由你自己和后端的同学一起定义。code等于10010和10011这两种状态都会跳转到登录页,重新进行登录并获取最新的token。

二、在一定时间内刷新token

为什么需要刷新token?因为出于安全性的考虑,一般是一天或几个小时更新token,看项目需要。

怎么实现?我和后端的同学是这么定义的,在发送任何一次请求时,如果需要更新token,响应体中后端的同学给我返回了token这个字段,token出现在了响应体中,说明这时候是需要刷新token的(其他非刷新token的请求时是没有token字段的),这时用localStorage保存最新token,自动覆盖掉原来旧的token,这样下次再调用新接口时用的就是最新的token了,这样用户也感知不到token更新的过程。

技术分享图片    技术分享图片

 

 

三、具体实现

/**
* 全局变量 和 设置 、配置等。。。
*/

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)

})

缓存工具类 Storage

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

  

最后,在评论有同学提到并发请求时,因为请求的过程快慢不同,token有可能还是旧的token。所以对于并发请求的情况还是要结合promise来使用

必备技能四、ajax及token

原文:https://www.cnblogs.com/qdwz/p/11433494.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!