用vue做一个简单的登录鉴权功能。

项目目录结构如下:

Login 组件

  登录成功后做本地存储和store存储,并进行跳转。

Login.vue关键代码:

    async handleLogin(e) {
e.preventDefault();
let parmas = {
username: this.model.username,
passwold: this.model.passwold
};
const res = await this.$http.get("/api/login", parmas);
const { code, token, massage } = res.data;
//code=='0'表示登录成功,进行本地存储和store存储 并进行跳转。
//else 弹出错误提示
if (code == "0") {
this.$store.commit("setToken", res.data.token);
localStorage.setItem("token", token);
//如果是由需要鉴权的页面跳转到登录页面 则redirect= this.$route.query.redirect,如果是直接点击登录跳转到登录页面,则redirect= '/'
const redirect = this.$route.query.redirect || "/";
this.$router.push(redirect);
} else {
const toast = this.$createToast({
time: 2000,
txt: massage || "登录失败",
type: "error"
});
toast.show();
}
}

store

  在Login组件里登录时token做了数据持久化处理,防止页面刷新丢失token。给store里的token赋初值的时候要取

store.js关键代码:

import Vue from 'vue'
import Vuex from 'vuex' Vue.use(Vuex) export default new Vuex.Store({
state: {
//token数据持久化,防止页面刷新丢失
token: localStorage.getItem('token') || ''
},
mutations: {
setToken(state, token) {
state.token = token
}
},
actions: { },
getters: {
//根据token是否存在,设置计算属性isLogin
isLogin(state) {
return !!state.token
}
}
})

router

  routes[]里用 mate.auth来标识是否需要鉴权。router.beforeEach做个全局路由守卫,根据是否需要鉴权以及是否已经登录来进行不同操作。

router.js代码:

import Vue from 'vue'
import Router from 'vue-router'
import Home from './views/Home.vue'
import Login from './views/Login.vue';
import store from './store';
Vue.use(Router) const router = new Router({
mode: 'history',
base: process.env.BASE_URL,
routes: [
{
path: '/',
name: 'home',
component: Home
},
{
path: '/login',
name: 'login',
component: Login
},
{
path: '/about',
name: 'about',
meta: { auth: true },//about需要做登录鉴权
component: () => import(/* webpackChunkName: "about" */ './views/About.vue')
}
]
})
router.beforeEach((to, from, next) => {
//to.meta.auth 表示需要做登录健全
//不需要的 可以直接next
if (to.meta.auth) {
//store.state.token 表示已经登录 可以直接next
//没有登录 跳转到/login 并携带参数redirect 方便登录后直接跳转到to.path
if (store.state.token) {
next();
} else {
next({
path: '/login',
query: { redirect: to.path }
})
}
} else {
next();
}
})
export default router;

axios拦截  

  axios.interceptors.request.use拦截axios所有http请求,如果存在token,则放入请求头。axios.interceptors.response.use拦截的axios的响应,如果token以及失效,则清除本地缓存和store存储并跳转到登录页面。

http-interceptors.js代码:

import axios from "axios";
import store from "./store";
import router from "./router";
// 拦截axios所有http请求,预先放入token请求头
axios.interceptors.request.use(config => {
if (store.state.token) {
// 若存在token,则放入请求头
config.headers.token = store.state.token;
}
return config;
}); // 响应拦截器,提前预处理响应
axios.interceptors.response.use(
response => {
// 如果code是-1,说明用户已注销或者token已过期
// 此时需要重新登录,并且还要清除本地缓存信息和store数据
if (response.status == 200) {
const data = response.data;
if (data.code == -1) {
logoutFun()
}
}
return response;
},
err => {
if (err.response.status === 401) { // 未授权
logoutFun()
}
}
); function logoutFun() {
// 清空本地缓存的token和store里的token
store.commit("setToken", "");
localStorage.removeItem("token");
// 跳转至登录页,并携带用户退出时或token失效时的页面路由,方便登录后直接跳转到此页面。
router.push({
path: "/login",
query: {
redirect: router.currentRoute.path
}
});
}

服务端中间件

  服务端也需要做请求处理的中间件。如果请求不是req.path不是'/api/login'并且没有携带token,则返回错误状态码401。
vue.config.js关键代码:
        app.use((req, res, next) => {
//只对api开头的请求做拦截处理
if (/^\/api/.test(req.path)) {
if (req.path == '/api/login' || req.headers.token) {
next();
} else {
//设置错误状态码为401
res.sendStatus('401')
next();
}
} else {
next();
}
})

vue项目中的登录鉴权的更多相关文章

  1. 测试开发【Mock平台】04实战:前后端项目初始化与登录鉴权实现

    [Mock平台]为系列测试开发教程,从0到1编码带你一步步使用Spring Boot 和 Antd React 框架完成搭建一个测试工具平台,希望作为一个实战项目能为你的测试开发学习有帮助. 一.后端 ...

  2. Vue项目中遇到的一些问题总结

    一.开发环境使用Ajax请求,报错  网上查的资料,在config中的index.js这样设置 proxyTable:{ '/api':{ target:'', //此处为你的API接口地址 chan ...

  3. vue项目中路由验证和相应拦截的使用

    详解Vue路由钩子及应用场景(小结):https://www.jb51.net/article/127678.htm vue项目中路由验证和相应拦截的使用:https://blog.csdn.net/ ...

  4. 使用网关zuul过滤器登录鉴权

    使用网关zuul过滤器登录鉴权     1.新建一个filter包         filte有很多种 pre.post.     2.新建一个类LoginFilter,实现ZuulFilter,重写 ...

  5. 浅谈 Axios 在 Vue 项目中的使用

    介绍 Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中. 特性 它主要有如下特性: 浏览器端发起XMLHttpRequests请求 Node端发起http ...

  6. vue 项目中当访问路由不存在的时候默认访问404页面

    前言: 在Vue项目中,当访问的页面路由不存在或错误时,页面显示为一片空白.然而,通常我们需要对访问url不存在或者错误的情况下添加默认的404页面,即not found页面. 一般的处理方法是: 在 ...

  7. 在vue项目中使用axios发送FormData

    这个是axios的中文文档,挺详细的: https://www.kancloud.cn/luponu/axios/873153 文档中的    使用 application/x-www-form-ur ...

  8. 在vue项目中 如何定义全局变量 全局函数

    如题,在项目中,经常有些函数和变量是需要复用,比如说网站服务器地址,从后台拿到的:用户的登录token,用户的地址信息等,这时候就需要设置一波全局变量和全局函数 定义全局变量 原理: 设置一个专用的的 ...

  9. 一步步教会你微信小程序的登录鉴权

    前言 为了方便小程序应用使用微信登录态进行授权登录,微信小程序提供了登录授权的开放接口.乍一看文档,感觉文档上讲的非常有道理,但是实现起来又真的是摸不着头脑,不知道如何管理和维护登录态.本文就来手把手 ...

随机推荐

  1. 搭建Django项目虚拟环境(Windows系统下)

    一.安装virtualenv 我们可以使用正式的Python环境中的pip进行安装.进入cmd界面,运行“ pip install virtualenv ”,完成安装后,可以运行“ where vir ...

  2. JDK与CGlib动态代理的实现

    应用的原型为 执行者:房屋中介Agency(分为JDKAgency.CGlibAgency) 被代理对象:程序员Programmer 被代理对象的实现接口:租户Tenement(CGlibAgency ...

  3. Java之加密算法

    加密算法主要分为对称加密.非对称加密.Hash加密. 一.何为对称加密? 对称加密是指对称密码编码技术,它的特点是文件加密和解密使用相同的密钥加密. 对称机密的密钥一般小于256bit.因为就密钥而言 ...

  4. 自定义zabbix脚本--网卡平均流量

    自定义zabbix脚本--网卡平均流量1. 在客户端修改配置文件 /etc/zabbix/zabbix_agentd.conf需要改动两个地方:(1) UnsafeUserParameters=1(2 ...

  5. maven项目pom.xml中使用不同源的jar/自定义仓库地址

    笔者本地使用aliyun的maven仓库,在github上找了一个jar,他需求使用第三方仓库. 比如要使用https://jitpack.io上面com.github.navinilavarasan ...

  6. java数据结构之自定义队列

    一.队列的特点 1.队列是线性结构 2.先进先出,先进入队列的排在队列前端,会比后进队列的先出队列.FIFO 二.通过数组来实现队列 //自己实现数组队列,队列的特定就是先进先出 public cla ...

  7. kNN进邻算法

    一.算法概述 (1)采用测量不同特征值之间的距离方法进行分类 优点: 精度高.对异常值不敏感.无数据输入假定. 缺点: 计算复杂度高.空间复杂度高. (2)KNN模型的三个要素 kNN算法模型实际上就 ...

  8. v-on可以监听多个方法吗?

    原文地址 v-on可以监听多个方法 <template> <div class="about"> <button @click="mycli ...

  9. SecureCRT 8.3注册码下载

    SecureCRT注册码是一款针对“SecureCRT 8.3”软件而制作的激活破解工具,可以完美激活“SecureCRT”软件,从而达到免费使用的目的.而SecureCRT则是一款非常优秀的且支持s ...

  10. 【计算机视觉】基于样本一致性的背景减除运动目标检测算法(SACON)

    SACON(SAmple CONsensus)算法是基于样本一致性的运动目标检测算法.该算法通过对每个像素进行样本一致性判断来判定像素是否为背景. 算法框架图 由上图可知,该算法主要分为四个主要部分, ...