在学习vue的过程中,正好项目中做的web系统对安全性有要求

转载自https://www.jianshu.com/p/d1a3fb71eb99

总:通过axios,vuex,及自定义的方法实现。
以下是思路:
1.做token刷新必不可少的是,token(请求时的token) / refresh_token(刷新token时用的refresh_token) / resetTime(token有效时间)
2.通过axios请求-回复来做相应的操作,具体实现如下:

对应修改之处:(自己看的,如果疑问,可留言)
一、在 main.js中 ,写入如下代码

import axios from 'axios'
import { getRefreshToken, isRefreshTokenExpired} from './assets/js/format' //刷新token的接口与过期时间倒计时
window.isReresh = false;//用于判断是否刷新,不能少 // 添加请求拦截器,在请求头中加token
axios.interceptors.request.use(
config => {
let token = sessionStorage.getItem('Authorization');
if (token) {
config.headers.Authorization = token;
}
return config;
},
error => {
return Promise.reject(error);
}); // http response 拦截器
axios.interceptors.response.use(
response => {
let resetTime= sessionStorage.getItem('resetTime');
let token = sessionStorage.getItem('Authorization');
if(token){//有没有token
isRefreshTokenExpired(resetTime);
if(resetTime<){//时间少于20分钟(1200),20分钟之内为期限
if(!window.isReresh){
window.isReresh = true;
let refresh_token = sessionStorage.getItem('refresh_token')
getRefreshToken(refresh_token).then(res => {
window.isReresh = false;
isRefreshTokenExpired(res.data.resetTime);// 重新获取的token有效时间
store.commit('changeLogin',{//vuex中修改相关信息
Authorization:res.data.access_token,
token_type:res.data.token_type,
refresh_token:res.data.refresh_token,
});
}).catch(err => {});
}
}else window.isReresh = false;
} return response; //请求成功的时候返回的data
},
error => {
try {
if (error.response) {
endLoading();
switch (error.response.status) {
case 401://token过期,清除它,清除token信息并跳转到登录页面
store.commit('DelToken');
router.replace({
path: '/login',
query: {
redirect: router.currentRoute.fullPath//登录之后跳转到对应页面
}
});
return;
case 403://权限
store.commit('DelToken');
router.replace({
path: '/login',
query: {
redirect: router.currentRoute.fullPath//登录之后跳转到对应页面
}
});
return;
}
}
return Promise.reject(error.response.data)
}
catch (e) {
}
});

二、在 自定义的jsformat.js中 ,写入如下代码

export function getRefreshToken(param) { // 刷新token 注意这里用到的service
let params = {
refreshToken:param
}
return axios.post(baseUrl+'/account-center/refresh/token',params)
.then((res) => {
return Promise.resolve(res.data)
})
} export function isRefreshTokenExpired(timestamp) {
clearInterval(window.interval);
window.interval = setInterval(()=>{
timestamp=timestamp-1
sessionStorage.setItem('resetTime',timestamp)
},1000)
}

三、在vuex中的mutation

changeLogin: function (state, user ) {
// CryptoJS.enc.Base64.stringify(obj) 加密
// CryptoJS.enc.Base64.parse(base64).toString(CryptoJS.enc.Utf8) 解密
state.Authorization = user.token_type + ' ' + user.Authorization;
state.refresh_token = user.refresh_token;
state.user_message = CryptoJS.enc.Base64.parse(user.Authorization.split('.')[1]).toString(CryptoJS.enc.Utf8);
sessionStorage.setItem('Authorization', state.Authorization);
sessionStorage.setItem('user_message', state.user_message);
sessionStorage.setItem('refresh_token', state.refresh_token);
},
DelToken(state){
state.Authorization = '';
sessionStorage.clear();
},

Vue中token的实现的更多相关文章

  1. vue中Axios的封装和API接口的管理

    前端小白的声明: 这篇文章为转载:主要是为了方便自己查阅学习.如果对原博主造成侵犯,我会立即删除. 转载地址:点击查看 如图,面对一团糟代码的你~~~真的想说,What F~U~C~K!!! 回归正题 ...

  2. vue中的路由独享守卫的理解

    1.vue中路由独享守卫意思就是对这个路由有一个单独的守卫,因为他的守卫方式于其他的凡是不太同 独享守卫于前置守卫使用方法大致是一样的 在路由配置的时候进行配置, { path:'/login', c ...

  3. 【翻译】使用Vuex解决Vue中的身份验证

    翻译原文链接:https://scotch.io/tutorials/handling-authentication-in-vue-using-vuex 我的翻译小站:https://www.zcfy ...

  4. vue中怎样实现 路由拦截器

    vue中怎样实现 路由拦截器(当用户没有登录的时候,跳转到登录页面,已经登录的时候,不能跳转到登录页,除非后台token失效) 在 我们需要实现这样 一个功能,登录拦截 其实就是 路由拦截,首先在定义 ...

  5. vue中采用axios发送请求及拦截器

    这几天在使用vue中axios发送get请求的时候很顺手,但是在发送post请求的时候老是在成功的回调函数里边返回参数不存在,当时就纳闷了,经过查阅资料,终于得到了解决方案,在此做一总结: 首先我们在 ...

  6. Vue中axios的封装和api接口的统一管理

    更新的是我csdn上的文章,需要的话可以看下,互相学习点击去我的csdn vue中axios的封装 在vue项目和后端交互获取数据时,通常使用axios库,官方文档:https://www.npmjs ...

  7. vue中引入mintui、vux重构简单的APP项目

    最近在学习vue时也了解到一些常用的UI组件,有用于PC的和用于移动端的.用于PC的有:Element(饿了么).iView等:用于移动端APP的有Vux.Mint UI(饿了么).Vant(有赞团队 ...

  8. vue中使用Ajax(axios)、vue函数中this指向问题

    Vue.js 2.0 版本推荐使用 axios 来完成 ajax 请求.Axios 是一个基于 Promise 的 HTTP 库,可以用在浏览器和 node.js 中. axios中文文档库:http ...

  9. vue中引入Tinymce富文本编辑器

    最近想在项目上引入一个富文本编辑器,之前引入过summernote,感觉并不太适合vue使用, 然后在网上查了查,vue中使用Tinymce比较适合, 首先,我们在vue项目的components文件 ...

随机推荐

  1. C++中为什么按两次ctrl+D才能结束标准I/O

    参考资料: https://www.douban.com/group/topic/127062773/ 今天学习了C++语言的标准I/O,也就是std::cin和std::cout,但是我发现当系统在 ...

  2. VS Code WebApi系列——1、配置

    Knowledge should be Shared in Free. 最近在研究VS code下的webapi,看了很多文档,还是微软官方的例子好,不过不太适应国人习惯,所以写点东西. 直接了当 开 ...

  3. gitbub.com设置协作者提交代码步骤

    1. 邀请协作者 点击settings 2. 等待协作者接受邀请 关注注册邮箱 3. 协作者生成公钥 一路回车即可 ssh-keygen -t rsa -b 4096 -C "公众号:九点半 ...

  4. Eureka心跳健康检查机制和Spring boot admin 节点状态一直为DOWN的排查(忽略某一个节点的健康检查)

    https://www.jdon.com/springcloud/eureka-health-monitoring.html 运行阶段执行健康检查的目的是为了从Eureka服务器注册表中识别并删除不可 ...

  5. CentOS 安装 VMware Tools 详细方法

    点击虚拟机,选择安装vmware Tools工具 弹出上面的界面,右键选择奖上面的vmwaraTools.tar.gz解压到你要解压的目录下面 记得一定要使用root用户,进入到解压的目录 然后执行 ...

  6. 我用shell写了个mud游戏:武林群侠传

    零.前言 学习shell的时候,无聊的我,写了个简单版的文字mud,暂且叫武林群侠传吧.可能90后都不知道文字mud是什么了--哈哈 壹.效果 先看下效果吧,GIF图如下 文字效果如下: [root@ ...

  7. vue项目chunk包loading失败解决办法

    错误截图: 解决方法: // loading chunk 出错处理 router.onError((error) => { const pattern = /Loading chunk (\d) ...

  8. No mapping found for HTTP request with URI [/***] in DispatcherServlet with name 'dispatcherServlet'

    相信不少Springboot初学者和我一样,都遇到上边这个提示,明明路径都是对的,但就是找不到对于的页面而404了,这也困扰我很长一段时间,我也是不得其解,百度上也鲜有合理回答,因为以前使用的时候,明 ...

  9. 写给.NET开发者的Python教程(一):C# vs Python: 语言特性、Conda和Jupyter Notebook环境

    承接上篇,本文会从语言特性.开发环境和必备工具来带领大家进入Python的世界. 语言特性 首先一起看下C#和Python在语言特性层面的对比,他们作为截然不同的两类面向对象高级语言,在语言层面上有何 ...

  10. 灵魂代码分享HTML元素标签语义化及使用场景实用到爆

    灵魂三问: 标签语义化是什么?为什么要标签语义化?标签语义化使用场景有哪些? 下面让我们跟着这三个问题来展开一下本文的内容. 一.标签语义化是什么? 标签语义化就是让元素标签做适当的事情.例如 p 标 ...