不知道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. Java基础之数据类型

    一.数据类型 基本数据类型介绍 byte 1字节 char 2字节 short 2字节 int 4字节 long 8字节 float 4字节 double 8字节 以上有Java中八大基本类型的7种, ...

  2. place-holder样式

    input::-webkit-input-placeholder, textarea::-webkit-input-placeholder { color: #777; } input:-moz-pl ...

  3. js读取json

    Json字符串是: [{"n":"aaa","un":"aaa"},{"n":"yang& ...

  4. PAT-1057 Stack (树状数组 + 二分查找)

    1057. Stack Stack is one of the most fundamental data structures, which is based on the principle of ...

  5. css实现手机端导航栏左右滑动

    <html> <head> <meta charset="utf-8"> <meta name="viewport" ...

  6. 使用net Manager工具远程连接Oracle配置监听

    一.在服务端配置Oracle端口 win + R 输入netca 弹出如下窗口后 选择监听程序配置,点击下一步: 二.配置端口号后使用Telnet工具调试端口是否连通 在命令行输入telnet 服务器 ...

  7. vue中使用jsx

    vue中使用jsx 为什么需要使用jsx呢?这个需要搞清楚 其实vue官方也说了,对于那些非常多v-if v-else的情况,就可以尝试使用render函数或者jsx,不过render函数写简单的结构 ...

  8. ngnix随笔四

    1.alias path 例1. =>http://www.a.com/bbs/ root /data/vhosts/; location /bbs/{ alias /data/a.com/; ...

  9. SQL查找大小为n的连续区间

    数据准备 create table sequence ( seq int not null primary key ); insert into values(3); insert into valu ...

  10. vnc server,vnc server去哪下载,下载后如何连接使用(vnc viewer)

    vnc server是vnc服务端,通过需要下载的服务器连接之后在服务器端下载. 1.使用到的工具:iis7服务器管理 2.首先去服务器端下载vnc 3.根据要求安装结束,得到登录密码. 4.用IIS ...