SpringBoot+Vue--token,vue导航守卫,axios拦截器-笔记3

news2024/11/14 17:21:55

自己学习记录,写的不详细,没有误导,不想误导

大概的登录逻辑,前后端完整实现:

1.用户名,密码验证成功后,后端签发token返回给前端

2.前端把token保存到本地存储

3.每次请求前,通过axios请求拦截器,统一发送token

4.通过Vue导航守卫,和axios响应拦截器,统一保护页面

新建个前端项目用来演示

这里我用的是VSCode

引入ElementUI  

 npm i element-ui -S

并且在main.js中引入

因为需要向后端发送请求,这里用axios

npm install axios

先整个登录页面演示,在views下创建login.vue

注意下,安装好axios,局部使用的时候

引入

 然后,如果,就可以发送请求。可以全局进行封装 

<template>
  <div>
    <el-form :rules="rules" ref="loginForm" :model="loginForm" class="loginContainer">
        <h3 class="loginTitle">系统登录</h3>
      <el-form-item prop="username">
        <!-- aoto-complete自动补全,其实可以不加,具体什么用不了解 -->
        <el-input type="text" aoto-complete="false" v-model="loginForm.username" placeholder="请输入用户名"></el-input>
      </el-form-item>
      <el-form-item prop="password">
        <el-input type="password" aoto-complete="false" v-model="loginForm.password" placeholder="请输入密码"></el-input>
      </el-form-item>
        <el-button type="primary" @click="submitLogin" style="width:100%">登录</el-button>
    </el-form>
  </div>
</template>


<script>
import axios from 'axios'
export default {
    name:"login",
    data(){
        return{
            captchaUrl:'',
            loginForm:{
                username:'admin',
                password:'123456',
                //code:''
            },
            checked:true,
            rules:{//校验规则需要FORM表单上绑定rules,还需要在对应item上写prop才可以对应
                username:[
                    {required: true, message:'请输入用户名', trigger: 'blur'},
                    {min:5,max:12,message:'长度在6到12个字符',trigger:'blur'}
                ],
                password:[
                    {required: true, message:'请输入密码', trigger: 'blur'},
                    {min:6,max:12,message:'长度在6到12个字符',trigger:'blur'}
                ],
            
            }
        }
    },
    methods:{
        submitLogin(){
            this.$refs.loginForm.validate((valid) => {
                if (valid) {
                    //alert('submit!');
                    axios.get("http://localhost:8081/login",{params:this.loginForm}).then(function(res){
                        console.log(res)
                        if(res.data!=null){
                            //window.localStorage.setItem("access-admin",JSON.stringify(res.data))//存字符串类型
                            //如果登录成功
                            window.sessionStorage.setItem("token",JSON.stringify(res.data.token))
                        }
                    })
                } else {
                    this.$message.error('请正确输入登录信息');
                    return false;
                }
            });
        }
    }
}
</script>

<style>
    .loginContainer{
        border-radius: 15px;
        background-clip: padding-box;
        margin:180px auto;
        width:350px;
        padding:15px 35px 15px 35px;
        background: #fff;
        border: 1px solid #eaeaea;
        box-shadow: 0 0 25px #cac6c6;
    }
    .loginTitle{
        margin:0px auto 40px auto;
        text-align:center;
    }
    .loginRemember{
        text-align: left;
        margin:0px 0px 15px 0px;
    }
</style>

路由

后端SpringBoot,引入了Web  JDBC  MYSQL  MYBATIS

简单些就不查数据库了,引入Web就可以了

创建一个实体类

 登录接口,先用来演示,token现在一般主流用JWT,这里用来演示,千万别误解

 前端启动默认用的8080,后端8081

这里想起来,发送Get请求,也太草率了.请求改成post,另外跨域问题,一会解决.改下,发送post请求

 然后先在后端

这里主要演示到底返回的这个res是个什么

如果我后端故意报个错

 

 

 把匿名函数改成箭头函数,他妈什么乱七八糟的

 

 如果登录成功

这里我们配置一个全局的关于请求和响应的拦截器

 在src下创建utils文件夹,新建api.js

// 导入安装的axios
import axios from 'axios'
// 导入elementUI错误消息提示
import { Message } from 'element-ui'
// 导入路由
import router from '../router'

// 创建axios请求实例,并暴
const myaxios = axios.create({
    baseURL: 'http://localhost:8081',
    timeout: 1000,
});

// 添加请求拦截器
myaxios.interceptors.request.use(function (config) {
    // 在发送请求之前做些什么
    // 一般是添加token再发送
    let token=window.sessionStorage.getItem("token")
    if(token){
        config.headers['token']=token
    }
    return config;
}, function (error) {
    // 对请求错误做些什么
    return Promise.reject(error);
});

// // 添加响应拦截器
// myaxios.interceptors.response.use(function (response) {
//     // 2xx 范围内的状态码都会触发该函数。
//     // 对响应数据做点什么
//     // 如果业务逻辑错误
//     if (response.status || response.status === 200) {
//         // 如果返回数据中code=500,或者是未登录401,权限错误403
//         if (response.data.code === 500 || response.data.code === 401 || response.data.code === 403) {
//             Message.error({ message: response.data.message });
//             return;
//         }
//         // 如果是其他
//         if (response.data.message) {
//             Message.success({ message: response.data.message });
//         }
//     }
//     return response.data;
// }, function (error) {
//     // 超出 2xx 范围的状态码都会触发该函数。
//     // 对响应错误做点什么
//     if (error.response.data.code === 504 || error.response.data.code === 404) {
//         Message.error({ message: '服务器被吃了( •̀ ω •́ )' });
//     } else if (error.response.data.code === 403) {
//         Message.error({ message: '权限不足,请联系管理员' });
//     } else if (error.response.data.code === 401) {
//         Message.error({ message: '尚未登录,请登录!' });
//         //跳往登录界面
//         router.push('/');
//     } else {
//         if (error.response.data.message) {
//             Message.error({ message: error.response.data.message });
//         }else{
//             Message.error({ message:'未知错误去( •̀ ω •́ )✧'});
//         }
//     }
//     return;
// });
//暴露接口
export default myaxios;

在main.js文件中全局引入配置好的myaxios。这样你在任何一个组件里都可以使用
this.$axios.get()、this.$axiso.post() 等等直接向服务器发送请求。

发送axios不需要局部引入

 且每次请求前,会去看,SessionStorage里有没有token

有的话放到请求头里,后端设置过滤器,验证请求头里的token

后端添加过滤器,具体逻辑就是判断Token,一般用JWT,这里写死了,不要误解

 

 路由导航

 

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

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

相关文章

【华为上机真题 2023】事件推送

&#x1f388; 作者&#xff1a;Linux猿 &#x1f388; 简介&#xff1a;CSDN博客专家&#x1f3c6;&#xff0c;华为云享专家&#x1f3c6;&#xff0c;Linux、C/C、云计算、物联网、面试、刷题、算法尽管咨询我&#xff0c;关注我&#xff0c;有问题私聊&#xff01; &…

机制设计原理与应用(四)预算可行的拍卖机制

文章目录4 预算可行的拍卖机制4.1 特征4.2 使用案例4.3 拍卖设计问题4.4 单调次模函数&#xff08;Monotone Submodular Function&#xff09;4.4.1 分配算法4.4.2 关键支付计划4.4.3 特性4.5 在线预算可行的拍卖机制4.5.1 Secretary Problem(A Optimal Stopping Problem)4.5.2…

如何与他人交流-第5期

上期我们讲了打破预期,顺应主体这期我们来讲讲如何建立亲和关系(关系侧)我的别人交流,只有在不把别人当成对象(工具人),而是把对方当成主体的情况下(让别人感受到尊重),这是相互尊重的终极本质,也是唯一方法.把别人当人看.认同对方,对方也会认同你.自信从何而来自信本意为相信自…

信息论复习—连续信源、信道及容量

目录 连续信源的熵&#xff1a; 连续信源离散化后的概率空间&#xff1a; 连续信源离散化后的熵&#xff1a; 连续信源的绝对熵&#xff1a; 连续信源的相对熵&#xff1a; 连续信源的条件熵&#xff1a; 连续信源的相对条件熵&#xff1a; 连续信源相对熵的最大化&#…

李宏毅ML-卷积神经网络CNN

李宏毅ML-卷积神经网络CNN 文章目录李宏毅ML-卷积神经网络CNNImage ClassificationConvolutional Layer1. Neural Version StoryReceptive FieldParameter Sharing2. Filter Version StoryFilterParameter Sharing3. Summary of Two VersionsPooling LayerThe Whole CNNDrawbac…

Hyperbolic geometry (双曲几何简介)

ContentsManifolds: A Gentle IntroductionManifoldsTangent SpacesMetric TensorRiemannian Manifolds (黎曼流形)Hyperbolic Geometry and Poincar EmbeddingsCurvature (曲率)Euclidean and Non-Euclidean GeometriesHyperbolic SpaceMinkowski SpaceHyperboloid (双曲面)Th…

树和森林(快来瞧)

森林的定义 森林是由多颗互不相交的树所构成的树的集合&#xff0c;即森林包含多棵树&#xff0c;每一棵树都有自己的根结点。一棵树也可以看成森林。 树的表示及基本操作 1.树&#xff08;一般树&#xff09;的表示方法 1.1树的双亲表示法 树的双亲表示法是将树的各个节点…

现场工程师出手-PCAPHub与云SSH隧道稳妥实现异地LAN工业联测

在去年&#xff0c;因为众所周知的因素影响&#xff0c;项目的甲方主动提出延缓设备的交付。作为乙方&#xff0c;尽管项目延缓是甲方提出的&#xff0c;但依旧希望按期交付&#xff0c;这样才能回款&#xff0c;熬过一年。其实&#xff0c;2022年初&#xff0c;几类传感器、压…

S7-1200PLC与ABB机器人进行PROFINET通信的具体方法和步骤详解

S7-1200PLC与ABB机器人进行PROFINET通信的具体方法和步骤详解 1. TIA博途一侧的配置: 当我们安装好RobotStudio软件后,可以在以下的目录中C:\ProgramData\ABB Industrial IT\Robotics IT\DistributionPackages\ABB.RobotWare-6.08.0134\RobotPackages\RobotWare_RPK_6.08.013…

【JavaWeb】JavaScript基础语法(上)

✨哈喽&#xff0c;进来的小伙伴们&#xff0c;你们好耶&#xff01;✨ &#x1f6f0;️&#x1f6f0;️系列专栏:【JavaWeb】 ✈️✈️本篇内容:JavaScript基础语法(上)&#xff01; &#x1f680;&#x1f680;代码托管平台github&#xff1a;JavaWeb代码存放仓库&#xff01…

ESP32设备驱动-TSL2561亮度传感器驱动

TSL2561亮度传感器驱动 1、TSL2561介绍 TSL2560 和 TSL2561 是第二代环境光传感器器件。每个都包含两个集成模数转换器 (ADC),用于集成来自两个光电二极管的电流。两个通道的整合同时发生。转换周期完成后,转换结果分别传送到通道 0 和通道 1 数据寄存器。传输是双缓冲的,…

【头歌】单链表的基本操作

单链表的基本操作第1关&#xff1a;单链表的插入操作任务描述本关任务&#xff1a;编写单链表的初始化、插入、遍历三个操作函数。相关知识链表是线性表的链式存储结构的别称&#xff0c;特点是以“指针”指示后继元素&#xff0c;因此线性表的元素可以存储在存储器中任意一组存…

Linux常用命令——speedtest-cli命令

在线Linux命令查询工具(http://www.lzltool.com/LinuxCommand) speedtest-cli 命令行下测试服务器外网速度 补充说明 speedtest-cli是一个使用python编写的命令行脚本&#xff0c;通过调用speedtest.net测试上下行的接口来完成速度测试&#xff0c;最后我会测试运维生存时间…

YOLOV3 Pytorch版本代码解读

YOLOV3 Pytorch版本代码解读 代码与coco数据集关注wx公众号JokerTong回复yolov3即可获取 参考视频 YOLO系列算法 文章目录YOLOV3 Pytorch版本代码解读数据集准备与关键文件说明前提准备代码大致流程需要自行修改代码的部分项目代码解读一 数据与标签的读取二 模型构造convoluti…

数据库工具类的编写

package com.bjpowernode.jdbc.utils;import java.sql.*; import java.util.ResourceBundle;/*** 数据库工具类简化JDBC的代码编写。** 在同一个没有结束的程序中&#xff0c;DBUtil类只加载一次&#xff0c;加载一次以后&#xff0c;再次调用该类中的方法&#xff0c;本不会再…

基于Echarts构建大数据招聘岗位数据可视化大屏

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

SpringBoot 3.0.x使用SpringDoc

为什么使用SpringDoc 在Springfox3.0停更的两年里&#xff0c;SpringBoot进入3.0时代&#xff0c; SpringFox出现越来越多的问题&#xff0c;最为明显的就是解析器的问题&#xff0c;已经在上文 中解释清楚&#xff0c;这里就不再赘述。 SpringDoc是Spring官方推荐的API&#x…

Spring笔记上(基于注解开发)

一、第三方资源配置管理 以DataSource连接池对象为例&#xff0c;进行第三方资源配置管理。 1. 管理DataSource连接池对象 spring整合Druid、C3P0数据库连接池 1.1 管理Druid连接池 1、准备数据 create database if not exists spring_db character set utf8; use spring_db; …

二、python基础语法篇(黑马程序猿-python学习记录)

黑马程序猿的python学习视频&#xff1a;https://www.bilibili.com/video/BV1qW4y1a7fU/ 目录 一 、print 1. end 2. \t对齐 二、字面量 1. 字面量的含义 2. 常见的字面量类型 3. 如何基于print语句完成各类字面量的输出 三、 注释的分类 1. 单行注释 2. 多行注释 3. 注释的…

MXNet的Faster R-CNN(基于区域提议网络的实时目标检测)《9》

MXNet的Faster R-CNN(基于区域提议网络的实时目标检测)《1》&#xff1a;论文源地址&#xff0c;克隆MXNet版本的源码&#xff0c;安装环境与测试&#xff0c;以及对下载的源码的每个目录做什么用的&#xff0c;做个解释。 MXNet的Faster R-CNN(基于区域提议网络的实时目标检测…