Vue中的验证登录状态
Vue项目中实现用户登录及token验证
先说一下我的实现步骤:
- 使用
easy-mock
新建登录接口,模拟用户数据 - 使用
axios
请求登录接口,匹配账号和密码 - 账号密码验证后, 拿到
token
,将token存储到sessionStorage
中,并跳转到首页 - 前端每次跳转时,就使用导航守卫(vue-router.beforeEach)判断
sessionStorage
中有无token
,没有就跳转到登录页面,有则跳转到对应路由页面。 - 注销后,就清除
sessionStorage
里的token
信息并跳转到登录页面
#使用easy-mock模拟用户数据
我用的是easy-mock,新建了一个接口,用于模拟用户数据:
{
"error_code": 0,
"data": [{
"id": '1',
"usertitle": "管理员",
"username": "admin",
"password": "123456",
"token": "@date(T)",
},
{
"id": '2',
"usertitle": "超级管理员",
"username": "root",
"password": "root",
"token": "@date(T)",
}
]
}
login.vue中写好登陆框:
<template>
<div>
<p>用户名:<input type='text' v-model="userName"></p>
<p>密码:<input type='text' v-model="passWord"></p>
<button @click="login()">登录</button>
</div>
</template>
<script>
export default {
data() {
return {
userName:'root',
passWord:'root'
}
}
}
</script>
然后下载axios:npm install axios --save
,用来请求刚刚定义好的easy-mock接口:
login(){
const self = this;
axios.get('https://easy-mock.com/mock/5c7cd0f89d0184e94358d/museum/login').then(response=>{
var res =response.data.data,
len = res.length,
userNameArr= [],
passWordArr= [],
ses= window.sessionStorage;
// 拿到所有的username
for(var i=0; i<len; i++){
userNameArr.push(res[i].username);
passWordArr.push(res[i].password);
}
console.log(userNameArr, passWordArr);
if(userNameArr.indexOf(this.userName) === -1){
alert('账号不存在!');
}else{
var index = userNameArr.indexOf(this.userName);
if(passWordArr[index] === this.passWord){
// 把token放在sessionStorage中
ses.setItem('data', res[index].token);
this.$parent.$data.userTitle = res[index].usertitle;
//验证成功进入首页
this.startHacking ('登录成功!');
//跳转到首页
this.$router.push('/index');
// console.log(this.$router);
}else{
alert('密码错误!')
}
}
}).catch(err=>{
console.log('连接数据库失败!')
})
}
这一步最重要的是当账号密码正确时,把请求回来的token
放在sessionStorage
中,
#配置路由
然后配置路由新加一个meta属性:
{
path: '/',
name: 'login',
component: login,
meta:{
needLogin: false
}
},
{
path: '/index',
name: 'index',
component: index,
meta:{
needLogin: true
}
}
判断每次路由跳转的链接是否需要登录,
#导航卫士
在main.js
中配置一个全局前置钩子函数:router.beforeEach()
,他的作用就是在每次路由切换的时候调用 这个钩子方法会接收三个参数:to、from、next。 to
:Route:即将要进入的目标的路由对象, from
:Route:当前导航正要离开的路由, next
:Function:个人理解这个方法就是函数结束后执行什么,先看官方解释 1.next()
:进行管道中的下一个钩子。如果全部钩子执行完了,则导航的状态就是confirmed(确认的), 2.next(false)
:中断当前的导航。如果浏览器的url改变了(可能是用户手动或浏览器后退按钮),那么url地址会重置到from路由对应的地址。 3.next('/')
或next({path:'/'})
:跳转到一个不同的地址。当前导航被中断,进入一个新的导航。
#用sessionStorage存储用户token
//路由守卫
router.beforeEach((to, from, next)=>{
//路由中设置的needLogin字段就在to当中
if(window.sessionStorage.data){
console.log(window.sessionStorage);
// console.log(to.path) //每次跳转的路径
if(to.path === '/'){
//登录状态下 访问login.vue页面 会跳到index.vue
next({path: '/index'});
}else{
next();
}
}else{
// 如果没有session ,访问任何页面。都会进入到 登录页
if (to.path === '/') { // 如果是登录页面的话,直接next() -->解决注销后的循环执行bug
next();
} else { // 否则 跳转到登录页面
next({ path: '/' });
}
}
})
这里用了router.beforeEach
vue-router导航守卫 每次跳转时都会判断sessionStorage
中是否有token
值,如果有则能正常跳转,如果没有那么就返回登录页面。
#注销
至此就完成了一个简单的登录状态了,浏览器关闭后sessionStorage
会清空的,所以当用户关闭浏览器再打开是需要重新登录的
当然也可以手动清除sessionStorage
,清除动作可以做成注销登录,这个就简单了。
loginOut(){
// 注销后 清除session信息 ,并返回登录页
window.sessionStorage.removeItem('data');
this.common.startHacking(this, 'success', '注销成功!');
this.$router.push('/index');
}
写一个清除sessionStorag
的方法。 一个简单的保存登录状态的小 Demo。
参考:
- DeveWork.com 上线“前端工具箱”(附源码下载)
- Debug和Release之本质区别
- ArgoUML -- 开源UML 建模工具
- 性能分析工具-PerfView
- c#测试字符串是否为GUID的几种方法
- 编译错误CS1595
- 分享一款带尖角浮出 公告栏 样式
- 在asp.net页面上得到Castle容器的实例
- WordPress自带TinyMCE编辑器相关功能增强
- 联众互动收购3家棋牌游戏公司,其域名买自蔡文胜手中
- 未来有什么工作绝对不会被人工智能取代
- WordPress在RSS Feed 中输出版权信息
- WordPress免插件仅代码实现文章浏览次数的方法(2)
- 苹果被告了,但网友们却觉得一点也不亏!
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- C# 软件版本号
- C# 实现登录并跳转界面
- QT 常用控件操作实例集锦
- C# Socket TCP发送图片与接收图片
- ingress通过daemonSet,nodeSelector,hostNetwork方式部署
- Oracle参数解析(event)
- Qt读写文件(2种方式)实现详解
- 字符串匹配 - KMP算法
- c# 判断文件是否发生了变化
- C# 用IrisSkin4.dll美化你的WinForm
- Oracle参数解析(shared_pool_size)
- C# GTS四轴运动控制器实例(固高科技步进电机不带编码器)
- Oracle参数解析(pre_page_sga)
- C#简单爬取数据(.NET使用HTML解析器NSoup和正则两种方式匹配数据)
- [WPF] WPF做的漂亮的登陆界面[附源码]