JWT登录验证前后端设计与实现笔记

news2025/1/24 7:10:27

设计内容

前端

  1. 配置全局前置路由守卫
  2. axios拦截器
  3. 登录页面和主页

后端

  1. JWT的封装
  2. 登录接口
  3. 中间件放行
  4. mysql数据库的连接
    在这里插入图片描述

详细设计

路由设计

配置全局前置守卫,如果访问的是登录页面则放行,不是则进入判断是否有token,没有则拦截回到登录页面,有则放行访问。

router.beforeEach((to, from, next) => {
  //如果是访问Login,则直接通过
  if(to.name==='Login'){
    next();
  }else{
    //如果没有token则进入登录页面
    if(!localStorage.getItem("token")){
      next({
        path:'/login'
      });
    }else{
        next();
    }
  }
});

axios拦截器

配置响应拦截器,拿到后端传来的token并保存到localStorage中,如果后端传回来了401错误(token失效),就会删除localStorage中的token并回到登录页面。

// 响应拦截
axios.interceptors.response.use(function (response) {
   //拿到响应里的token
   console.log(response);
   const authorization  = response.data.token;
   console.log(authorization);
   authorization && localStorage.setItem("token",authorization);
   return response;
 }, function (error) {
   const { status } = error.response;
   if(status===401){
      localStorage.removeItem("token");
      router.push("/login");
   }
   return Promise.reject(error);
 });

配置请求拦截器,把localStorage中的token加到请求头中的Authorization中。

//请求拦截
axios.interceptors.request.use(function (config) {
   const token = localStorage.getItem("token");
   //请求时带上token,给后端认证
   config.headers.Authorization = `${token}`;
   return config;
 }, function (error) {
   return Promise.reject(error);
 });

登录页面和主页

在这里插入图片描述
登录方法写得比较简单,请求登录接口,判断后端返回的结果。

LoginHandle(){
   if(this.loginForm.password || this.loginForm.username){
      axios.post("http://localhost:3000/login",this.loginForm).then(res=>{
         if(res.data.status == "success"){
            this.$router.push("/mainbox");
         }else{
            ElMessage.error('用户名或密码错误!');
         }
      })
   }else{
      ElMessage.error('请填写账号和密码!');
   }
}

访问主页时会请求后端的接口,主页请求时所携带的token给后端处理,后端会判断 token是否过期,如果过期后端就回应401错误码,401错误码被axios的响应拦截器处理,跳回登录页面。

mounted(){
   this.getIndex();
},
methods:{
   getIndex(){
      axios.get('http://localhost:3000/bill').then(res=>{
         console.log(res.data);
      })
   }
}

JWT封装

JWT是JSON Web Token的缩写,jsonwebtoken这个模块有两个常用的方法,sign()和verify()作用分别是生成token和验证token,sign()方法需要3个基本的参数,1.加密内容,2.密钥,3.过期时间。verify()方法有2个基本参数,1.加密内容,2.密钥。

const jwt = require("jsonwebtoken");
const secret = "samrol";
const JWT = {
   generate(value,expires){
      return jwt.sign(value,secret,{expiresIn:expires});
   },
   verify(token){
      try{
         return jwt.verify(token,secret);
      }catch(error){
         return false;
      }
   }
}
module.exports = JWT;

登录接口

访问/login时后端会做:拿到前端请求带过来的账户和密码,连接数据库,查询登录信息是否正确,不正确则回应登录错误给前端,信息正确:生成token,把token添加到header的Authorization里,返回成功信息。

const express = require("express");
const router = express.Router();
const mysql2 = require("mysql2");
const JWT = require("../util/JWT");
const getDBConfig = require("../util/mysql");

router.post("/",async (req,res)=>{
   const {username,password} = req.body;
   const config = getDBConfig();
   const promisePool = mysql2.createPool(config).promise();
   var user = await promisePool.query(`select * from user where name=? and password=?`,[username,password]);
   //登陆成功
   if(user[0].length>0){
      //生成token
      const token = JWT.generate({username,password},"10s");
      //设置头部
      res.header("Authorization",token);
      res.send({status:"success",message:"登录成功",token});
   }else{
      res.send({status:"error",message:"用户名或密码错误"});
   }
})

module.exports = router;

补充一个数据库连接配置

function getDBConfig(){
   return{
      host:'127.0.0.1',
      port:3306,
      user:'root',	
      password:'',
      database:'vue_test',
   }
}

module.exports = getDBConfig;

接口拦截中间键

接收到的每次请求都需要通过这个中间件,如果是login接口则直接放行,其他的则需要通过验证前端携带的token是否过期来判断能否放行,如果过期则返回401错误码来提醒用户token过期需要重新登录。

app.use((req,res,next)=>{
   if(req.url==="/login"){
      next();
      return;
   }
   const token = req.headers['authorization']//.split(" ")[1];
   if(token){
      var payload = JWT.verify(token);
      if(JWT.verify(token)){
         const newToken = JWT.generate({
            username:payload.username,
            password:payload.password,
         },"10s");
         res.header("Authorization",newToken);
         next();
      }else{
         res.status(401).send({errCode:"-1",errorInfo:"token过期!"});
      }
   }
})

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1454429.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一连三部电影撤出春节档,给行业带来什么启示?

继《我们一起摇太阳》后,《红毯先生》于2月16日晚也宣布退出今年春节档。 至此,加上动画电影《黄貔:天降财神猫》,2024年春节档已有三部影片撤档,在春节档历届过往中实属少见。 其中,《红毯先生》、《我们…

安装配置NMon

NMon(Nigel’s Monitor)是一款由IBM公司提供的免费性能监控工具,专门用于监控AIX系统和Linux系统的资源使用情况 下载软件 wget http://sourceforge.net/projects/nmon/files/nmon16p_binaries.tar.gz 如果报错的话,安装提示添加…

论文阅读_用模型模拟记忆过程

英文名称: A generative model of memory construction and consolidation 中文名称: 记忆构建和巩固的生成模型 文章: https://www.nature.com/articles/s41562-023-01799-z 代码: https://github.com/ellie-as/generative-memory 作者: Eleanor Spens, Neil Burgess&#xff…

Python算法100例-1.7 最佳存款方案

完整源代码项目地址,关注博主私信’源代码’后可获取 1.问题描述2.问题分析3.算法设计4.完整的程序 1.问题描述 假设银行一年整存零取的月息为0.63%。现在某人手中有一笔钱,他打算在今后5年中的每年年底取出1000元,到第5年时刚…

matlab代码--基于stbc编码的MIMO-OFDM系统的误码率分析

1 前言 空时分组编码STBC(Space Time Block Coding)用在无线通信中传输一个数据流的多个拷贝。通过许多天线来产生数据的多种接收版本,提高数据传输的可靠性。接收机接收到的数据拷贝中,存在一些比其它拷贝“更好”的拷贝。而这种…

04 SS之JWT和base64

1.1 jwt和token 1.1.1 token介绍 令牌(Token):在计算机领域,令牌是一种代表某种访问权限或身份认证信息的令牌。它可以是一串随机生成的字符或数字,用于验证用户的身份或授权用户对特定资源的访问。普通的令牌可能以…

【动态规划】【C++算法】2742. 给墙壁刷油漆

作者推荐 【数位dp】【动态规划】【状态压缩】【推荐】1012. 至少有 1 位重复的数字 本文涉及知识点 动态规划汇总 LeetCode2742. 给墙壁刷油漆 给你两个长度为 n 下标从 0 开始的整数数组 cost 和 time ,分别表示给 n 堵不同的墙刷油漆需要的开销和时间。你有…

多行重定向,expect,字符串处理,高级变量,脚本工具

一,多行重定向 (一)含义 使用I/O重定向的方式将命令列表提供给交互式程序 标准输入的一种替代品 Here Document 是标准输 入的一种替代品,可以帮助脚本开发人员不必使用临时文件来构建输入信息,而是直接就地 生产出…

Unity类银河恶魔城学习记录7-6 P72 Bouncy sword源代码

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释,可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili Sword_Skill_Controller.cs using System.Collections; using System.Colle…

Github 2024-02-18 开源项目日报 Top10

根据Github Trendings的统计,今日(2024-02-18统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目5PowerShell项目1Rust项目1PHP项目1Jupyter Notebook项目1TypeScript项目1 Black:不妥…

力扣51. N 皇后(回溯)

Problem: 51. N 皇后 文章目录 题目描述思路解决方法复杂度Code 题目描述 思路 1.决策路径:board中小于row的那些行都已经成功放置了皇后; 2.选择列表:第row行的所有列都是放置皇后的选择(则根据N皇后相互攻击的股则编写判断当前决…

JVM常见问题笔记分享

文章目录 1 JVM组成1.1 JVM由那些部分组成,运行流程是什么?1.2 什么是程序计数器?1.3 你能给我详细的介绍Java堆吗?元空间(MetaSpace)介绍 1.4 什么是虚拟机栈1.5 堆和栈的区别1.6 能不能解释一下方法区?1.5.1 概述1.5.2 常量池1…

鸿蒙应用模型开发-更新SDK后报错解决

更新SDK后提示 “ohos.application.Ability”/“ohos.application.AbilityStage”等模块找不到或者无相关类型声明 问题现象 更新SDK后报错“Cannot find module ‘ohos.application.AbilityStage’ or its corresponding type declarations”,“Cannot find modu…

【springboot+vue项目(十五)】基于Oauth2的SSO单点登录(二)vue-element-admin框架改造整合Oauth2.0

Vue-element-admin 是一个基于 Vue.js 和 Element UI 的后台管理系统框架,提供了丰富的组件和功能,可以帮助开发者快速搭建现代化的后台管理系统。 一、基本知识 (一)Vue-element-admin 的主要文件和目录 vue-element-admin/ |…

裁员不可怕,可怕的是软件测试行业在发生巨变,而你却原地踏步

🔥 交流讨论:欢迎加入我们一起学习! 🔥 资源分享:耗时200小时精选的「软件测试」资料包 🔥 教程推荐:火遍全网的《软件测试》教程 📢欢迎点赞 👍 收藏 ⭐留言 &#x1…

Android Studio 的 Gradle Task 没有显示

问题 Android Studio 的 Gradle Task 没有显示 详细问题 笔者需要获取android应用MD5,一种方法是 但是笔者的Android Studio 的 Gradle Task 没有显示 解决方案 依次点击:File -> Settings -> Experimental -> 取消勾选 “Do not build …

轻松采集商品 全称免滑块 精准实时数据采集|全平台电商API接口

随着电子商务的快速发展,越来越多的商家和消费者选择在淘宝上进行交易。 淘宝商品详情API接口轻松采集淘宝上的商品信息,全程免滑块,实现精准实时数据采集。 一、采集商品信息 商品详情API接口采用先进的爬虫技术,能够快速准确…

Python学习路线图

防止忘记,温故知新 进阶路线

医学超声模式简介

B模式 B是英文单词“亮度”(Brightness)的第一个字母,因为被观察结构的回声或亮度取决于反射信号的强度,它用平面图形的形式来显示被探查组织的具体情况。检查时,首先将人体界面的反射信号转变为强弱不同的光点&#x…

Python实现时间序列分析使用LOESS(STL)模型进行季节性趋势分解(STL算法)项目实战

说明:这是一个机器学习实战项目(附带数据代码文档视频讲解),如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 时间序列分析中,LOESS(局部加权回归平滑)和STL(Seasona…