先说一下个人实现步骤:javascript
easy-mock
新建登陆接口,模拟用户数据axios
请求登陆接口,匹配帐号和密码token
,将token存储到sessionStorage
中,并跳转到首页sessionStorage
中有无 token
,没有就跳转到登陆页面,有则跳转到对应路由页面。sessionStorage
里的token
信息并跳转到登陆页面我用的是easy-mock,新建了一个接口,用于模拟用户数据:html
{ "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接口:vue
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
中,java
而后配置路由新加一个meta属性:ios
{ path: '/', name: 'login', component: login, meta:{ needLogin: false } }, { path: '/index', name: 'index', component: index, meta:{ needLogin: true } }
判断每次路由跳转的连接是否须要登陆,web
在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:'/'})
:跳转到一个不一样的地址。当前导航被中断,进入一个新的导航。vue-router
//路由守卫 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
值,若是有则能正常跳转,若是没有那么就返回登陆页面。vuex
至此就完成了一个简单的登陆状态了,浏览器关闭后sessionStorage
会清空的,因此当用户关闭浏览器再打开是须要从新登陆的数据库
固然也能够手动清除sessionStorage
,清除动做能够作成注销登陆,这个就简单了。
loginOut(){ // 注销后 清除session信息 ,并返回登陆页 window.sessionStorage.removeItem('data'); this.common.startHacking(this, 'success', '注销成功!'); this.$router.push('/index'); }
写一个清除sessionStorag
的方法。
一个简单的保存登陆状态的小Demo。
参考:
腾讯云社区-Vue+SessionStorage实现简单的登陆
SF-从先后端分别学习——注册/登陆流程2
Vue-router实现单页面应用在没有登陆状况下,自动跳转到登陆页面
vue+axios新手实践实现登录
Vue实战(四)登陆/注册页的实现
vue页面控制权限,vuex刷新保存状态、登陆状态保存
vue页面控制权限,vuex刷新保存状态、登陆状态保存
(vue.js)先后端分离的单页应用如何来判断当前用户的登陆状态?
Vue登陆注册,并保持登陆状态
vue登陆注册及token验证
Vue项目中实现用户登陆及token验证
vue-router守卫导航官方文档:vue-router导航守卫