不知道vuex的可以先看一下 vuex官方文档,这里就不赘述了。

实现思路:假设我们现在想要访问自己在博客园里写的博客,这时候服务器需要知道当前用户是谁,才能确定我们是否有访问权限并正确地返回我们需要的信息,因此这里必须要进行用户名密码验证,即登录操作,验证成功则跳转到请求页面,不成功则跳转到登录页。关于验证这里有两种情况,一种是输入用户名和密码以后点击登录会触发验证,第二种是没有点击登录,只是单纯的路由跳转,这时候可能存在用户名密码过期从而验证失败的情况,所以我们的验证也要在点击登录以及页面跳转这两种情况下进行。

首先写一个登录框,为登录按钮添加login事件

<el-form ref="loginForm" :model="loginForm" label-width="70px" >
<el-form-item label="用户名" prop="username">
<el-input v-model="loginForm.username" placeholder="请输入用户名"></el-input>
</el-form-item>
<el-form-item label="密码" prop="password">
<el-input type="password" v-model="loginForm.password" @keyup.enter.native="login" placeholder="请输入密码"></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" class="button" @click="login">登录</el-button>
</el-form-item>
</el-form>

点击登录按钮后触发store的action里的Login方法,并将用户名和密码作为参数传递过去

login () {
let params = {
'username': this.loginForm.username,
'password': this.loginForm.password
};
this.$store.dispatch('Login', params)
.then(() => {this.$router.push({ path: '/' });
})
.catch((error) => {
console.log(error.response);
});
}

退出登录时触发action里的LogOut方法

logOut () {
this.$store.dispatch('LogOut').then(() => {
//跳转到登录页面
this.$router.push('/login');
})
}

创建store.js文件

import Vue from 'vue';
import Vuex from 'vuex';
import axios from 'axios'; const store = new Vuex.Store({
state: {
status: '',
token: localStorage.getItem('token') || '',
user: {}
},
mutations: {
auth_request(state) {
state.status = 'loading';
},
auth_success(state, token, user) {
state.status = 'success';
state.token = token;
state.user = user;
},
auth_error(state) {
state.status = 'error';
},
logout(state) {
state.status = '';
state.token = '';
},
},
actions: {
Login({commit}, user) {
return new Promise((resolve, reject) => {
commit('auth_request')
// 向后端发送请求,验证用户名密码是否正确,请求成功接收后端返回的token值,利用commit修改store的state属性,并将token存放在localStorage中
axios.post('login', user)
.then(resp => {
const token = resp.data.token
const user = resp.data.user
localStorage.setItem('token', token)
// 每次请求接口时,需要在headers添加对应的Token验证
axios.defaults.headers.common['Authorization'] = token
// 更新token
commit('auth_success', token, user)
resolve(resp)
})
.catch(err => {
commit('auth_error')
localStorage.removeItem('token')
reject(err)
})
})
},
LogOut({ commit, state }) {
return new Promise((resolve, reject) => {
axios.get('Logout')
.then(response => {
removeIsLogin()
localStorage.removeItem('loginUsername');
// 移除之前在axios头部设置的token,现在将无法执行需要token的事务
            delete axios.defaults.headers.common['Authorization'];
     resolve(response)
})
.catch(error => {
reject(error)
})
})
}
},
getters: {
// !!将state.token强制转换为布尔值,若state.token存在且不为空(已登录)则返回true,反之返回false
isLoggedIn: state => !!state.token,
authStatus: state => state.status
}
}); export default store;

用router.beforeEach控制路由跳转时访问页面的权限 (关于to.matched.some的解释见 https://router.vuejs.org/zh/guide/advanced/meta.html)

router.beforeEach((to, from, next) => {
// 检测路由配置中是否有requiresAuth这个meta属性
if (to.matched.some(record => record.meta.requiresAuth)) {
// 判断是否已登录
if (store.getters.isLoggedIn) {
next();
return;
}
// 未登录则跳转到登录界面
next('/login');
} else {
next()
}
})

拦截axios请求处理token过期问题

axios.interceptors.response.use(
response => {
return response;
},
error => {
if (error.response) {
switch (error.response.status) {
case 401:
//跳转登录
this.$store.dispatch(logout);
}
}
}
);

vuex登录验证及保持登录状态的更多相关文章

  1. WebApi用户登录验证及服务器端用户状态存取

    最近项目需要给手机端提供数据,采用WebApi的方式,之前的权限验证设计不是很好,这次采用的是Basic基础认证. 1.常见的认证方式 我们知道,asp.net的认证机制有很多种.对于WebApi也不 ...

  2. Shiro安全框架入门篇(登录验证实例详解与源码)

    转载自http://blog.csdn.net/u013142781 一.Shiro框架简单介绍 Apache Shiro是Java的一个安全框架,旨在简化身份验证和授权.Shiro在JavaSE和J ...

  3. Express + Session 实现登录验证

    1. 写在前面 当我们登录了一个网站,在没有退出登录的情况下,我们关闭了这个网站 ,过一段时间,再次打开这个网站,依然还会是登录状态.这是因为,当我们登录了一个网站,服务器会保存我们的登录状态,直到我 ...

  4. cookie和session实现登录验证

    回话技术,比如在做登录功能的时候,需要配合是用存储在客户端的cookie信息,以及存储在服务端的session来实现登录功能.在cookie中保存了用户的信息,特别是一个特殊的令牌信息,当用户拿着这个 ...

  5. Linux登录验证机制、SSH Bruteforce Login学习

    相关学习资料 http://files.cnblogs.com/LittleHann/linux%E4%B8%AD%E7%94%A8%E6%88%B7%E7%99%BB%E5%BD%95%E8%AE% ...

  6. Asp.NetMVC利用LigerUI搭建一个简单的后台管理详解(函登录验证)

    上一篇 Asp.Net 中Grid详解两种方法使用LigerUI加载数据库数据填充数据分页  了解了LigerUI 中Grid的基本用法  现在结合上一篇的内容做一个简单的后台管理,当然也有前台的页面 ...

  7. 洗礼灵魂,修炼python(81)--全栈项目实战篇(9)—— 购物商城登录验证系统

    都在线购物过吧?那么你应该体验过,当没有登录账户时,点开购物车,个人中心,收藏物品等的操作时,都会直接跳转到登录账户的界面,然后如果登录一次后就不用再登录,直到用户登出. 是的,本次项目就是做一个登录 ...

  8. 【笔记】vue+springboot前后端分离实现token登录验证和状态保存的简单实现方案

    简单实现 token可用于登录验证和权限管理. 大致步骤分为: 前端登录,post用户名和密码到后端. 后端验证用户名和密码,若通过,生成一个token返回给前端. 前端拿到token用vuex和lo ...

  9. ASP.NET MVC 登录验证

     好久没写随笔了,这段时间没 什么事情,领导 一直没安排任务,索性 一直在研究代码,说实在的,这个登录都 搞得我云里雾里的,所以这次我可能也讲得不是 特别清楚,但是 我尽力把我知道的讲出来,顺便也对自 ...

随机推荐

  1. React-Router4 按需加载的4种实现

    其实几种实现都是近似的,但具体上不太一样,其中有些不需要用到bundle-loader 第一种:ReactTraining/react-router 介绍的基于 webpack, babel-plug ...

  2. utf8mb4复杂昵称问题

    wechat_ling wl_channel_consumer nickname wl_consumer nickname alter table wl_channel_consumer modify ...

  3. CF894B Ralph And His Magic Field

    题目链接:http://codeforces.com/contest/894/problem/B 题目大意: 往一个 \(n \times m\) 的网格中填数字 \((1 \le n,m \le 1 ...

  4. Oracle 中序列使用

    转 https://www.cnblogs.com/21-forever/p/11265924.html 序列: 1.Oracle是不支持自增长的: ①.序列是用于生成唯一.连续序号的对象: ②.序列 ...

  5. C# HttpClient 使用 Consul 发现服务

    试用了Overt.Core.Grpc, 把 GRPC 的使用改造得像 WCF, 性能测试也非常不错, 非常推荐各位使用. 但已有项目大多是 http 请求, 改造成 GRPC 的话, 工作量比较大, ...

  6. Event Loop、 宏任务和微任务

    本文将介绍我自己对JS Event Loop 和 宏任务.微任务的理解. 二话不说先上图: 接下来将会针对此图讲解什么是Event Loop 什么事宏任务和微任务(其实聪明的你们通过图大体也能了解的是 ...

  7. springboot系列——重试机制原理和应用,还有比这个讲的更好的吗(附完整源码)

    1. 理解重试机制 2. 总结重试机制使用场景 3. spring-retry重试组件 4. 手写一个基于注解的重试组件 5. 重试机制下会出现的问题 6. 模板方法设计模式实现异步重试机制 如果有, ...

  8. [PHP自动化-进阶]004.Snoopy VS CURL 模拟Discuz.net登陆

    引言:采集论坛第一步就是要模拟登陆,由于各个站点登录表单各不相同,验证方式又是多种多样,所以直接提交用户名密码到登录页面就比较繁琐. 所以我们采用cookie来模拟登陆无疑是最佳捷径. 今天我们要处理 ...

  9. [批处理教程之Git]001.Git 常用命令大全

    基本技巧 1.安装后的第一步 安装git后,第一件事你需要设置你的名字和邮箱,因为每次提交都需要这些信息. $ git config --global user.name "Some One ...

  10. Java IO(八) PipedInputStream 和 PipedOutputStream

    Java IO(八) PipedInputStream 和 PipedOutputStream 一.介绍 PipedInputStream 和 PipedOutputStream 是管道输入流和管道输 ...