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

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


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


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

文章目录

  • 一、前言
  • 二、代码
    • 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 {@AutowiredRedisUtil 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的keyboolean 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.mzph.cn/news/758549.shtml

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

相关文章

【数据结构】猛猛干11道链表OJ(未完待续ing)

前言知识点 链表的调试技巧 int main() {struct ListNode* n1(struct ListNode*)malloc(sizeof(struct ListNode));assert(n1);struct ListNode* n2(struct ListNode*)malloc(sizeof(struct ListNode));assert(n2);struct ListNode* n3(struct ListNode*)malloc(sizeof(struc…

蓝桥杯 2023 省B 飞机降落

首先&#xff0c;这题要求的数据量比较少&#xff0c;我们可以考虑考虑暴力解法。 这题可能难在很多情况的考虑&#xff0c;比如说&#xff1a; 现在时间是10&#xff0c;有个飞机20才到&#xff0c;我们是可以干等10分钟。 #include <iostream> #include <…

对话奇酷网络董事长吴渔夫: 迟到的游戏公司会被AI浪潮卷入海底

“ 迟到的游戏公司会被无形的 AI 浪潮卷入海底。” 整理 | 梦婕 编辑 | 云舒 出品&#xff5c;极新 2024年3月4日&#xff0c;在极新与吴渔夫的对话中&#xff0c;吴渔夫多次呼吁“全力拥抱AI”。在这场AI浪潮中&#xff0c;作为中国网游的先锋&#xff0c;他带着 25 年“中…

【web前端】<meta>标签

meta元素可以提供有关页面的元信息&#xff08;meta-information&#xff09; meta标签位于文档的头部&#xff0c;是空元素 meta元素的属性 属性值描述http-equiv expires refresh X-UA-compatible 定义HTTP协议的头部元信息名称。其中&#xff0c;expires设置网页在缓存区的…

记录一下目前为止的算法成长

每日笔记 复习曲线 间隔1天、3天、7天、15天、30天&#xff0c;然后以一个月为周期复习 2023. 12. 24 一定要每天早中晚都要复习一下 早中午每段一两道, 而且一定要是同一个类型, 不然刷起来都没有意义 11.29 开始向着面试刷题跟进! 每天刷4题左右 ,一周之内一定要是统一类…

笔记本8代i5和台式机12代i5的性能比较

一、 台式机12代i5 二、笔记本8代i5 在多核性能上差不多是2.4倍&#xff0c;所以跑大一点的Matlab或者别的程序&#xff0c;用台式机&#xff0c;后边实验室能用上超多核服务器另说。

uniapp,导航栏(切换项)有多项,溢出采取左滑右滑的形式展示

一、实现效果 当有多项的导航&#xff0c;或者说切换项&#xff0c;超出页面的宽度&#xff0c;我们采取可滑动的方式比较好一些&#xff01;并且在页面右边加个遮罩&#xff0c;模拟最右边有渐变效果&#xff01; 二、实现代码 html代码&#xff1a; <!-- 头部导航栏 --…

鸿蒙Harmony应用开发—ArkTS-转场动画(共享元素转场)

当路由进行切换时&#xff0c;可以通过设置组件的 sharedTransition 属性将该元素标记为共享元素并设置对应的共享元素转场动效。 说明&#xff1a; 从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 属性 名称参数参数描述…

F. Microcycle(dfs 搜寻路径 + 并查集)

解析&#xff1a; 本题的意思是&#xff0c;求一个环的最小的那条边。 并且输出其这个环的点。 我们可以利用并查集&#xff0c;进行确定其是否有环路。在将所用的边从大到小排序。 利用 vector容器&#xff0c;pop_back() 和 push的特性。 起点为 u终点为 v寻找路径。 代…

投简历没回复?9位DBA公众号集结,快上车!

&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是【IT邦德】&#xff0c;江湖人称jeames007&#xff0c;10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】&#xff01;&#x1f61c;&#x1f61c;&#x1f61c; 中国DBA联盟(ACD…

寄快递很麻烦怎么办?无脑方法教会你便宜寄快递!快冲!

现在我们每天都会去寄快递&#xff0c;不仅寄大件还会发物流&#xff0c;但是我们真的了解快递的价格吗&#xff1f;寄快递必须拿到快递驿站吗&#xff1f;去菜鸟驿站寄快递会给我们便宜吗&#xff1f;有没有什么便宜的寄快递的方法呢&#xff1f;驿站会有包装快递的包装袋吗&a…

Wireshare捕获接口中没有本地连接

1. 查看npf服务是否启动 服务名无效&#xff0c;需要安转WinPcap 2. 勾选Npcap Packet Driver (NPCAP) 3. 重新启动Wireshark 重新启动Wireshark后&#xff0c;本地连接有了

SpringCloud从入门到精通速成(一)

文章目录 1.认识微服务1.0.学习目标1.1.单体架构1.2.分布式架构1.3.微服务1.4.SpringCloud1.5.总结 2.服务拆分和远程调用2.1.服务拆分原则2.2.服务拆分示例2.2.1.导入Sql语句2.2.2.导入demo工程 2.3.实现远程调用案例2.3.1.案例需求&#xff1a;2.3.2.注册RestTemplate2.3.3.实…

学生信息管理系统--修改信息(非常详细的修改,更新,撤销,删除逻辑)

目录 概述修改包括的操作修改在每个模块中的应用 详解修改与更新取消删除 特殊概念数据集游标 总结 概述 学生信息管理系统&#xff0c;功能相对简单且代码重复性高&#xff0c;应该采用复用的思想来减少代码的冗余和提高代码的可维护性。然而&#xff0c;对于基础入门项目来说…

NVM使用教程

文章目录 ⭐️写在前面的话⭐️1、卸载已经安装的node2、卸载nvm3、安装nvm4、配置路径以及下载源5、使用nvm下载node6、nvm常用命令7、全局安装npm、cnpm8、使用淘宝镜像cnpm9、配置全局的node仓库&#x1f680; 先看后赞&#xff0c;养成习惯&#xff01;&#x1f680;&#…

Word2vec学习笔记

&#xff08;1&#xff09;NNLM模型&#xff08;神经网络语言模型&#xff09; 语言模型是一个单纯的、统一的、抽象的形式系统&#xff0c;语言客观事实经过语言模型的描述&#xff0c;比较适合于电子计算机进行自动处理&#xff0c;因而语言模型对于自然语言的信息处理具有重…

MySQL学习八:窗口函数(一)

目录 一、窗口函数1. 窗口函数定义2. 窗口函数语法3. 演示表格一4. 窗口的确定4.1 例1&#xff1a;查询各班级总分4.2 例2&#xff1a;查询各班级累计总分4.3 分区子句&#xff08;partition by&#xff09;4.4 排序子句&#xff08;order by&#xff09;4.5 窗口子句&#xff…

单片机-- 数电(3)

编码器与译码器 译码 &#xff1a;将二进制代码转化为其他进制的代码 编码 &#xff1a;就是将其他代码转换为二进制码 编码器的类型 1二进制编码器 用n位二进制数码对2的n次方个输入信号进行编码的电路 2二-十进制编码器 将0到9十个十进制数转化为二进制代码的电路 2…

crossover虚拟机 crossover软件干嘛的 虚拟机软件的使用方法 mac虚拟机装windows

与传统的虚拟机软件&#xff08;如VMware、VirtualBox&#xff09;相比&#xff0c;CrossOver具有更高的运行效率和更好的用户体验。因为它并不创建一个完整的Windows虚拟机&#xff0c;而是仅模拟应用程序所需的运行环境。这使得CrossOver在启动和运行Windows应用程序时更加快…

手撕HashMap底层源码(学习内容全)

day28上 集合框架 标绿已经学习底层&#xff0c;深入底层主要是研究实现类底层 手撕HashMap底层源码 JDK1.7版本的HashMap为例&#xff08;注意实验代码时进行版本切换&#xff09; 代码注释参考理解 //day27初识 public class HashMap<K,V> extends AbstractMap<K,…