使用AOP拦截全局请求并校验请求参数

news2024/11/23 18:28:32

天行健,君子以自强不息;地势坤,君子以厚德载物。


每个人都有惰性,但不断学习是好好生活的根本,共勉!


文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。

文章目录

  • 一、前言
  • 二、代码
    • 1. 依赖pom.xml
    • 2. 主程序类Application.java
    • 3. 请求控制类AopController.java
    • 4. Aop拦截类AspectExecution.java
  • 三、执行
    • 1. 执行程序
    • 2. 发送请求
    • 3. 控制台输出


一、前言

关于AOP的使用可参考: Java AOP 简单实例演示

本篇使用AOP的 @Before注解进行全局请求的拦截,并在所有拦截的请求执行前进行请求参数的校验,校验通过则执行请求,校验不通过则抛错终止所拦截的请求。

具体:
在用户登录时,后端生成一个token字符串,存入redis并定义过期时间,同时给到前端,此时前端的操作每个请求都会带着请求的缓存进行访问调用
服务中的每个请求头中都含有token的参数值,用户每次访问调用一个接口时都会被aop拦截进行token校验
redis中的token与用户请求时的token一致则正常执行,不一致则抛错终止该请求的执行

二、代码

1. 依赖pom.xml

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>2.7.3</version>
        </dependency>

        <!--集成Redis依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
            <version>2.7.3</version>
        </dependency>

        <!--json 工具-->
        <dependency>
            <groupId>com.alibaba.fastjson2</groupId>
            <artifactId>fastjson2</artifactId>
            <version>2.0.33</version>
        </dependency>

        <!--项目注解工具-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.24</version>
        </dependency>

        <!--aop-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
            <version>2.7.3</version>
        </dependency>
        
    </dependencies>

2. 主程序类Application.java

import org.aspectj.lang.annotation.Aspect;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * @ClassDescription:
 * @JdkVersion: 1.8
 * @Author: 李白
 * @Created: 2024/3/18 14:12
 */
@Aspect
@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

3. 请求控制类AopController.java

import com.alibaba.fastjson2.JSONObject;
import org.springframework.web.bind.annotation.*;

/**
 * @ClassDescription: aop 测试请求类
 * @JdkVersion: 1.8
 * @Author: 李白
 * @Created: 2024/3/18 15:38
 */
@RestController
@RequestMapping("/aop")
public class AopController {

    @PostMapping("/test")
    public JSONObject test(@RequestHeader("token")String token,
            @RequestHeader("userGroup")String userGroup,
            @RequestHeader("username")String username){

        System.out.println("登录请求触发==========================》》》》》》》》》》》》》》》》");
        System.out.println("request token: "+token);
        //定义json对象,存储用户登录信息
        JSONObject loginInfo = new JSONObject();
        loginInfo.put("userGroup", userGroup);
        loginInfo.put("username", username);
        loginInfo.put("token", token);

        System.out.println("登录请求结束===================================》》》》》》》》》》》》》》》》》》》》》");
        return loginInfo;
    }

}

4. Aop拦截类AspectExecution.java

import com.u.u.utils.RedisUtil;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;

/**
 * @ClassDescription:
 * @JdkVersion: 1.8
 * @Author: 李白
 * @Created: 2024/3/20 10:34
 */
@Aspect
@Component
@Slf4j
@Order(2)
public class TokenAspectExecution {

    @Autowired
    RedisUtil redisUtil;
	//指定被切入点的方法列表,表示只对aop_test包中以Controller结尾的所有方法生效
    @Pointcut("execution(public * com..aop_test.*Controller.*(..))")
    //@Pointcut("execution(public * com..*Controller.*(..))")
    public void sig(){}
    
    @Before("sig()")
    public void beforeRequest(){
        log.info("-----------前置通知-----------");
        ServletRequestAttributes srAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        assert srAttributes != null;
        HttpServletRequest hsRequest = srAttributes.getRequest();
        String token = hsRequest.getHeader("token");
        String username = hsRequest.getHeader("username");
        System.out.println("token:" + token);
        System.out.println("username: " + username);
        
        //获取到token后去redis中查看
        //redis中是否含有token的key
        boolean hasToken = redisUtil.hasKey("login#" + username);
//        boolean hasToken = true;
        Object object = redisUtil.get("login#" + username);
        //redis中的token是否与传入的token一致
        boolean isToken = object.toString().equals(token);
//        boolean isToken = false;
        if (hasToken){
            //token存在,进行验证,
            System.out.println("token存在,进行验证");
            if (isToken){
                //token校验通过,放行
                System.out.println("token一致,校验通过,请求放行");
            }else {
                //token验证未通过,返回请求失败
                System.out.println("token不一致,校验失败,请求拒绝");
                throw new RuntimeException("token不一致,校验失败,请求拒绝");
            }
        }else {
            //验证不通过,请求退回
            //redis中没有token的键,说明没有登录或登录时间过期(4小时)
            System.out.println("token不存在,未登录或token过期");
            throw new RuntimeException("token不存在,未登录或token过期");
        }
        
    }

}


三、执行

1. 执行程序

启动主程序运行服务
在这里插入图片描述

2. 发送请求

postman发送请求
在这里插入图片描述

3. 控制台输出

token不一致,请求中断
在这里插入图片描述


感谢阅读,祝君暴富!

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

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

相关文章

QT:界面显示(更新调试/数据显示信息),QTableWidget

1.在界面中添加新控件&#xff1a;tableWidget_data 2.接口&#xff1a;输入&#xff1a;nameString &#xff08;此行的内容&#xff0c;会作为表头&#xff09;&#xff0c;dataString &#xff08;内容&#xff0c;会根据“&#xff0c;”进行分割&#xff0c;依次加入到表中…

深入理解Java中的TCP连接:三次握手和四次挥手

欢迎来到我的博客&#xff01;今天我们将一起探索网络通信的奥秘。在Java编程中&#xff0c;我们经常会涉及到网络通信&#xff0c;而TCP协议是实现可靠数据传输的重要协议之一。在建立TCP连接和断开连接的过程中&#xff0c;三次握手和四次挥手是至关重要的步骤。本文将深入探…

【Flutter 面试题】Flutter如何进行本地存储和缓存数据?

【Flutter 面试题】Flutter如何进行本地存储和缓存数据&#xff1f; 文章目录 写在前面口述回答补充说明实际案例完整代码示例运行结果详细说明 写在前面 &#x1f64b; 关于我 &#xff0c;小雨青年 &#x1f449; CSDN博客专家&#xff0c;GitChat专栏作者&#xff0c;阿里云…

JMH微基准测试框架学习笔记

一、简介 JMH&#xff08;Java Microbenchmark Harness&#xff09;是一个用于编写、构建和运行Java微基准测试的框架。它提供了丰富的注解和工具&#xff0c;用于精确控制测试的执行和结果测量&#xff0c;从而帮助我们深入了解代码的性能特性。 二、案例实战 在你的pom文件…

静态代理IP如何测试?

随着互联网的普及&#xff0c;越来越多的人开始使用动态IP进行上网。但是在某些情况下&#xff0c;我们可能需要使用静态IP进行测试或特定的网络设置。本文将介绍如何获取静态IP进行测试以及静态IP的优点。 一、如何获取静态IP进行测试&#xff1f; 1.联系ISP&#xff08;Int…

【工具】DataX 数据同步工具

简介 DataX 是阿里云 DataWorks数据集成 的开源版本&#xff0c;在阿里巴巴集团内被广泛使用的离线数据同步工具/平台。DataX 实现了包括 MySQL、Oracle、OceanBase、SqlServer、Postgre、HDFS、Hive、ADS、HBase、TableStore(OTS)、MaxCompute(ODPS)、Hologres、DRDS, databe…

短视频矩阵系统技术交付

短视频矩阵系统技术交付&#xff0c;短视频矩阵剪辑矩阵分发系统现在在来开发这个市场单个项目来说&#xff0c;目前基本上已经沉淀3年了&#xff0c;那么我们来就技术短视频矩阵剪辑系统开发来聊聊 短视频矩阵系统经过315大会以后&#xff0c;很多违规的技术开发肯定有筛选到了…

突飞猛进,智能饮品机器人如何助力实体经济?

近日&#xff0c;财务部公布了2024年第一季度及全年财报。数据显示&#xff0c;连锁品牌增长速度惊人&#xff0c;这其中不得不提到智能饮品机器人的使用&#xff0c;为不同的品牌门店拼速度、抢点位立下了不小的功劳&#xff0c;那么智能饮品机器人到底如何助力各门店&#xf…

NVIDIA Chat with RTX教程使用以及CUDA和CUDNN

基本环境安装&#xff1a;CUDA12.1CUDNNcudnn-windows-x86_64-8.9.7.29_cuda12-archive 1、CUDA下载 CUDA官方安装教程: https://docs.nvidia.com/cuda/cuda-installation-guide-microsoft-windows/index.html CUDA Toolkit的下载: CUDA Toolkit 12.1 Downloads | NVIDIA Dev…

目标检测---IOU计算详细解读(IoU、GIoU、DIoU、CIoU、EIOU、Focal-EIOU、SIOU、WIOU)

常见IoU解读与代码实现 一、✒️IoU&#xff08;Intersection over Union&#xff09;1.1 &#x1f525;IoU原理☀️ 优点⚡️缺点 1.2 &#x1f525;IoU计算1.3 &#x1f4cc;IoU代码实现 二、✒️GIoU&#xff08;Generalized IoU&#xff09;2.1 GIoU原理☀️优点⚡️缺点 2…

WT32-ETH02 plus 串口转以太网开发,WT32-ETH01网关开发板升级款!

广受欢迎的WT32-ETH01网关开发板迎来了升级。 就是这款启明云端新推出的嵌入式串口转以太网开发板——WT32-ETH02 plus。应广大客户的需求&#xff0c;在WT32-ETH01的基础上增加了POE供电&#xff0c;可广泛应用于智能家居和网关等应用。开发板搭载2.4GHz Wi-Fi和蓝牙双模的SO…

plasmo开发浏览器插件MAIN模式的content脚本和普通模式content脚本通讯方案

plasmo是一个很棒的开发浏览器插件的框架&#xff0c;可以使用react和vue等语言开发&#xff0c;也是目前github上star数量最多的开发浏览器插件的框架。 github仓库地址&#xff1a;GitHub - PlasmoHQ/plasmo: &#x1f9e9; The Browser Extension Framework 官网地址&…

idea找不到或无法加载主类

前言 今天在运行项目的时候突然出了这样一个错误&#xff1a;IDEA 错误 找不到或无法加载主类,相信只要是用过IDEA的朋友都 遇到过它吧&#xff0c;但是每次遇到都是一顿焦头烂额、抓耳挠腮、急赤白咧&#xff01;咋整呢&#xff1f;听我给你吹~ 瞧我这张嘴~ 问题报错 找不…

高精度电子秤资料教程分享

高精度电子秤资料教程分享 资料下载地址&#xff1a; 高精度电子秤资料教程: https://url83.ctfile.com/d/45573183-60459202-c325be?p7526 (访问密码: 7526)

小白学视觉 | 超详细!Python中 pip 常用命令

本文来源公众号“小白学视觉”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;超详细&#xff01;Python中 pip 常用命令 相信对于大多数熟悉Python的人来说&#xff0c;一定都听说并且使用过pip这个工具&#xff0c;但是对它的了…

基于Springboot的在线装修管理系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的在线装修管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构…

python爬虫基础实验:通过DBLP数据库获取数据挖掘顶会KDD在2023年的论文收录和相关作者信息

Task1 读取网站主页整个页面的 html 内容并解码为文本串&#xff08;可使用urllib.request的相应方法&#xff09;&#xff0c;将其以UTF-8编码格式写入page.txt文件。 Code1 import urllib.requestwith urllib.request.urlopen(https://dblp.dagstuhl.de/db/conf/kdd/kdd202…

数据结构从入门到精通——直接选择排序

直接选择排序 前言一、选择排序的基本思想&#xff1a;二、直接选择排序三、直接选择排序的特性总结&#xff1a;四、直接选择排序的动画展示五、直接选择排序的代码展示test.c 六、直接选择排序的优化test.c 前言 直接选择排序是一种简单的排序算法。它的工作原理是每一次从未…

kafka集群介绍及搭建

介绍 kafka是一个高性能、低延迟、分布式的消息传递系统&#xff0c;特点在于实时处理数据。集群由多个成员节点broker组成&#xff0c;每个节点都可以独立处理消息传递和存储任务。 路由策略 发布消息由key、value组成&#xff0c;真正的消息是value&#xff0c;key是标识路…

Springboot+vue的船舶维保管理系统(有报告)。Javaee项目,springboot vue前后端分离项目。

演示视频&#xff1a; Springbootvue的船舶维保管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot vue前后端分离项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09…