使用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,一经查实,立即删除!

相关文章

列表(list)篇(一)

文章目录 2.1 创建列表2.2 append()函数2.3 clear()函数2.4 copy()函数2.5 count()函数2.6 del2.7 enumerate()函数2.8 extend()函数2.9 index()函数 2.1 创建列表 在Python中&#xff0c;列表&#xff08;list&#xff09;是一种基础的数据结构&#xff0c;可以包含不同类型的…

【数据结构】猛猛干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 年“中…

Flutter项目组件模块化开发的实践与搭建

在Flutter应用程序的开发中&#xff0c;组件模块化是一种非常重要的开发方式&#xff0c;它可以提高代码的可维护性、复用性和扩展性。本文将介绍如何在Flutter项目中搭建组件模块化开发的框架&#xff0c;并给出实际的实践示例。 1. 为什么需要组件模块化开发&#xff1f; 在…

【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题左右 ,一周之内一定要是统一类…

c语言:最大公约数

最大公约数 任务描述 最大公约数&#xff08;也称最大公因数、最大公因子&#xff09;&#xff0c;指两个或多个整数共有约数中最大的一个。 编程输入两个正整数&#xff0c;输出它们的最大公约数。 输入示例 36 24输出示例 12代码 方法1&#xff1a;辗转相除法 #inclu…

笔记本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;在N诺oj和牛客网上都有提交。今天就总结部分题目&#xff0c;只写我觉得值得写的&#xff08;当然还有一些我不会写&#xff0c;不想去学了&#xff09;。 1、二进制数 输入输出格式 输入描述: 每行有一个数字n&#…

探索顺序表操作:从理论到实践

### 探索顺序表操作&#xff1a;从理论到实践 顺序表是数据结构中一种基础而重要的线性表&#xff0c;它通过一段连续的存储空间顺序存储数据元素。与链表相比&#xff0c;顺序表的优势在于支持随机访问&#xff0c;使得数据的检索效率非常高。然而&#xff0c;由于数据存储的…

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

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

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

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

Linux下使用Pycharm

1.下载pycharm 访问Pycharm官网地址https://www.jetbrains.com/pycharm/download/#sectionlinux&#xff0c;找到PyCharm的下载页面。接着&#xff0c;根据个人需求&#xff0c;选择适宜的操作系统及版本&#xff0c;下载官方提供的pycharm.tar.gz文件进行安装&#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;对于基础入门项目来说…