Vue项目中实现用户登录及token验证

news/2024/7/10 0:36:13 标签: vue

在前后端完全分离的情况下,Vue项目中实现token验证大致思路如下:

1、第一次登录的时候,前端调后端的登陆接口,发送用户名和密码

2、后端收到请求,验证用户名和密码,验证成功,就给前端返回一个token

3、前端拿到token,将token存储到localStorage和vuex中,并跳转路由页面

4、前端每次跳转路由,就判断 localStroage 中有无 token ,没有就跳转到登录页面,有则跳转到对应路由页面

5、每次调后端接口,都要在请求头中加token

6、后端判断请求头中有无token,有token,就拿到token并验证token,验证成功就返回数据,验证失败(例如:token过期)就返回401,请求头中没有token也返回401

7、如果前端拿到状态码为401,就清除token信息并跳转到登录页面

vuex_17">一、调登录接口成功,在回调函数中将token存储到localStorage和vuex中

login.vue

<template>
  <div>
    <input type="text" v-model="loginForm.username" placeholder="用户名"/>
    <input type="text" v-model="loginForm.password" placeholder="密码"/>
    <button @click="login">登录</button>
  </div>
</template>
 
<script>
import { mapMutations } from 'vuex';
export default {
  data () {
    return {
      loginForm: {
        username: '',
        password: ''
      }
    };
  },
 
  methods: {
    ...mapMutations(['changeLogin']),
    login () {
      let _this = this;
      if (this.loginForm.username === '' || this.loginForm.password === '') {
        alert('账号或密码不能为空');
      } else {
        this.axios({
          method: 'post',
          url: '/user/login',
          data: _this.loginForm
        }).then(res => {
          console.log(res.data);
          _this.userToken = 'Bearer ' + res.data.data.body.token;
          // 将用户token保存到vuex中
          _this.changeLogin({ Authorization: _this.userToken });
          _this.$router.push('/home');
          alert('登陆成功');
        }).catch(error => {
          alert('账号或密码错误');
          console.log(error);
        });
      }
    }
  }
};
</script>

在这里插入图片描述
store文件夹下的index.js

import Vue from 'vue';
import Vuex from 'vuex';
Vue.use(Vuex);
 
const store = new Vuex.Store({
 
  state: {
    // 存储token
    Authorization: localStorage.getItem('Authorization') ? localStorage.getItem('Authorization') : ''
  },
 
  mutations: {
    // 修改token,并将token存入localStorage
    changeLogin (state, user) {
      state.Authorization = user.Authorization;
      localStorage.setItem('Authorization', user.Authorization);
    }
  }
});
 
export default store;

二、路由导航守卫

router文件夹下的index.js

import Vue from 'vue';
import Router from 'vue-router';
import login from '@/components/login';
import home from '@/components/home';
 
Vue.use(Router);
 
const router = new Router({
  routes: [
    {
      path: '/',
      redirect: '/login'
    },
    {
      path: '/login',
      name: 'login',
      component: login
    },
    {
      path: '/home',
      name: 'home',
      component: home
    }
  ]
});
 
// 导航守卫
// 使用 router.beforeEach 注册一个全局前置守卫,判断用户是否登陆
router.beforeEach((to, from, next) => {
  if (to.path === '/login') {
    next();
  } else {
    let token = localStorage.getItem('Authorization');
 
    if (token === null || token === '') {
      next('/login');
    } else {
      next();
    }
  }
});
 
export default router;

三、请求头加token

axios.interceptors.request.use(
  config => {
    if (localStorage.getItem('Authorization')) {
      config.headers.Authorization = localStorage.getItem('Authorization');
    }
 
    return config;
  },
  error => {
    return Promise.reject(error);
  });

四、如果前端拿到状态码为401,就清除token信息并跳转到登录页面

     localStorage.removeItem('Authorization');
      this.$router.push('/login');

http://www.niftyadmin.cn/n/1821885.html

相关文章

Spring学习-day13

需求&#xff1a; 用户购买图书&#xff0c;购买成功&#xff0c;库存更新&#xff0c;账户余额更新&#xff0c;若余额或者库存不够&#xff0c;均不能购买成功&#xff0c;产生异常 数据表: account: 账户表(包括用户名和余额)book&#xff1a;图书表(id, 书名, 图书价格)boo…

Python_面向过程_对象与闭包

-- 查看和自定义文档的方法. # 查看和自定义文档# help(print)# __doc__ 魔术属性# print(print.__doc__) -- 全局变量,局部变量及global关键字的使用 # python 允许在函数内部定义全局变量&#xff1b;def ceshi004():   global b   b 5ceshi004()print(b) ""&…

ubuntu20.04 更新到opencv4后出现代码编译错误问题解决

1. 问题描述&#xff1a; 在ubuntu系统中&#xff0c;把opencv3.x 升级到opencv4之后&#xff0c;自己的c代码编译出现下面问题&#xff1a; lpr_chinese_det.cpp:8:10: fatal error: opencv2/core/core.hpp: 没有那个文件或目录 8 | #include <opencv2/core/core.hpp&…

(右偏树)Bzoj2333: [SCOI2011]棘手的操作

题面 戳我 Sol 右偏树滑稽并查集 再在全局开一个可删除的堆(priority_queue) 注意细节 # include <bits/stdc.h> # define RG register # define IL inline # define Fill(a, b) memset(a, b, sizeof(a)) using namespace std; typedef long long ll; const int _(3e5 1…

怎么还原计算机网络,怎么把网络协议还原为默认设置

为了进行网络中的数据交换而建立的规则、标准或约定称为网络协议&#xff0c;怎么把网络协议还原为默认设置呢?佰佰安全网看看吧。1&#xff0c;在首页界面上点击开始-设置-连接。2&#xff0c;来到连接设置界面&#xff0c;选择添加新调制解调器连接。3&#xff0c;输入连接的…

c++基础(十二)——多态性

多态性 多态性是指操作接口具有表现多种形态的能力&#xff1a;它能够根据操作环境的不同而采用不同的处理方式&#xff0c;或者一组具有相同语义的方法能够在统一接口下为不同的对象服务。 多态性的实现&#xff1a; 绑定机制&#xff1a;绑定是将一个标识符和存储地址联系在一…

golang高性能日志库zap

简介 zap是uber开源的Go高性能日志库 为什么选择Uber-go zap 在介绍Uber-go的zap包之前&#xff0c;让我们先看看Go语言提供的基本日志功能。Go语言提供的默认日志包是Go Logger&#xff1a;https://golang.org/pkg/log/ Go Logger的优势和劣势 优势: 它最大的优点是使用非…

shell脚本安装 nfs-server

#!/bin/bash: <<DESCProgram:NFS Server installbr/>372032196qq.comHistory:20171129 v1.0 20171130 v1.1 修改内容如下&#xff1a;1、取消grep "样式" 文件 &>/dev/null if [ $? -ne 0 ];then的使用方法&#xff0c;修改为 if grep -q "样式…