SpringBoot使用AOP

news2024/12/26 10:42:21

Spring相信大家都学过,就不多述了。

自定义注解,注解的类中所有的接口都会执行AOP增强,注解的接口会执行AOP增强。

注解类:

package xin.students.examManagement.annotation.springConfiguration;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;


/**
 * 目标方法上添加@UserIfLogin注解,可以在AOP切面中进行拦截,并执行相应的登录验证逻辑
 * 这个类本身并不会直接执行任何登录验证逻辑,它只是作为一个标记,用于告诉AOP切面在哪些方法上应该执行登录验证
 */
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface RequiresLogin {

}

AOP增强类:

package xin.students.examManagement.Aspect;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;


/**
 * 验证是否登录的AOP
 */
@Aspect
@Component
public class IfLoginAspect   {

//这个切点表达式的作用是确定需要拦截和执行切面逻辑的方法,包括添加了@RequiresLogin注解的方法以及添加了@RequiresLogin注解的类的所有方法。        
@Before("@annotation(xin.students.examManagement.annotation.springConfiguration.RequiresLogin) || @within(xin.students.examManagement.annotation.springConfiguration.RequiresLogin)")
    public void validateLogin(JoinPoint joinPoint) {
        System.out.println("开始登录验证");
    }
}

SpringBoot主类:

@SpringBootApplication
@EnableAspectJAutoProxy  //开始AOP配置
@ComponentScan(basePackages = "xin.students.examManagement.*")
public class ExamManagementApplication {

    public static void main(String[] args) {
        SpringApplication.run(ExamManagementApplication.class, args);
    }
}

测试类:

package xin.students.examManagement.configuration;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import xin.students.examManagement.annotation.springConfiguration.RequiresLogin;

@RestController
@RequiresLogin
public class TestController {

    @GetMapping("/secure-page")
    public String securePage() {
        // 这个方法需要登录验证
        return "Secure Page";
    }

    @GetMapping("/public-page")
    public String publicPage() {
        // 这个方法不需要登录验证
        return "Public Page";
    }
}

添加依赖!

<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjweaver</artifactId>
    <version>1.9.7</version>
</dependency>
<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjrt</artifactId>
    <version>1.9.7</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-aop</artifactId>
    <version>5.3.13</version>
</dependency>

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

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

相关文章

tensorboard 如何导出数据

tensorboard 如何导出数据 场景描述&#xff1a;有时候在第一遍跑实验的时候&#xff0c;由于epoch和内部循环变量的原因&#xff0c;做出来的图可能不是我们想要的&#xff0c;这个时候&#xff0c;需要自己导出数据并且重新画图&#xff0c;本文介绍如何导出数据道json或csv格…

超声波功率放大器在超声驱动技术中的应用

超声波功率放大器是一种能够将低功率信号放大到足够高的电平的电子器件。在超声驱动技术中&#xff0c;超声波功率放大器被广泛应用于超声波发生器、超声波换能器和超声波传感器等部件中&#xff0c;以保证这些部件的正常工作和高效性能。 超声波功率放大器在超声驱动技术中的应…

C++primer(第五版)第十二章(动态内存)

C中内存包含静态内存,栈内存,自由空间(堆). 静态内存用于保存局部的static(静态)对象,以及定义于任何函数以外的变量(全局变量). 栈内存用来保存定义在函数内的非static对象,由编译器自动创建和销毁. 程序可以用堆来存储动态分配的对象,同时也需要由我们来显式地销毁. 12.1…

【第四天学习】数组

数组批量数据处理 数组的定义 速度是一个相同类型的用同一个标识符封装到一起的基本数据类型&#xff0c;可以使用一个统一的速度名或者是索引来唯一确定速度中的每个元素&#xff0c;它的执行效率非常高。 数组中每一个变量称为数组的元素&#xff0c;数组能够容纳元素的数…

Centos7安装wordpress图文教程

宝塔面板安装WordPress有两种方法&#xff1a; 自己手动安装&#xff08;推荐&#xff09;宝塔后台一键部署跳转提示 推荐使用手动安装&#xff0c;因为一键部署的WordPress版本不是最新的&#xff0c;而且自己上传的文件比较放心。 第一步&#xff0c;上传WordPress安装包 …

提升UE5写实效果的项目设置

随着虚幻引擎5&#xff08;Unreal Engine 5&#xff0c;简称UE5&#xff09;的发布&#xff0c;游戏开发者和数字艺术家们迎来了一个全新的机会&#xff0c;可以在其强大的渲染引擎下创建更加逼真和令人惊叹的游戏和虚拟场景。然而&#xff0c;要实现出色的写实效果&#xff0c…

经典轻量级神经网络(2)MobileNetV2及其在Fashion-MNIST数据集上的应用

经典轻量级神经网络(2)MobileNet V2及其在Fashion-MNIST数据集上的应用 1 MobileNet V2的简述 MobileNet V2 创新性的提出了具有线性bottleneck 的Inverted 残差块。这种块特别适用于移动设备和嵌入式设备&#xff0c;因为它用到的张量都较小&#xff0c;因此减少了推断期间的…

Redis 入门指南

Redis 入门指南 目录 Redis 入门指南 Redis 基本概念 Redis 常用命令 字符串String操作命令&#xff1a; 哈希Hash操作命令&#xff1a; 列表list操作命令 集合set操作命令&#xff1a; 有序集合sorted set 操作命令 通用命令 在Java中操作 Redis 1.Jedis 2.Spring …

windows后台窗口启动jar包

启动命令 chcp 65001 //切换utf-8 echo off start javaw -jar test-1.0-SNAPSHOT.jar --spring.profiles.activeprod echo 启动成功&#xff0c;按任意键结束 pause exit查看后台进程命令 wmic process where caption"javaw.exe" get processid,caption,commandli…

手机里的视频怎么转换成MP4格式?简单的转换方法分享

MP4格式是一种广泛使用的视频格式&#xff0c;几乎所有设备和操作系统都支持MP4格式的视频播放。无论是使用 iPhone、iPad、安卓手机、电视等各种设备&#xff0c;都可以播放 MP4 格式的视频。这种广泛的兼容性使得 MP4 成为一种非常方便的视频格式&#xff0c;我们可以随时随地…

IDEA自动生成实体类

操作流程 第一次需要配置Generate POJOs.groovy 新建该文件 Generate POJOs.groovy import com.intellij.database.model.DasTable import com.intellij.database.model.ObjectKind import com.intellij.database.util.Case import com.intellij.database.util.DasUtil import…

嵌入式面试刷题(day1)

文章目录 前言一、由for( ; ;)引出的一系列问题二、sizeof和strlen的误区三、字符串转义字符带来的问题四、结构体概念模糊五、&#xff01;和~概念分不清六、switch case误区七、短路运算八、复合赋值运算符带来的问题九、什么是左值什么是右值十、struct和union总结 前言 最…

cuda sample-asyncAPI(01)

C:\ProgramData\NVIDIA Corporation\CUDA Samples\v11.0\0_Simple\asyncAPI 这个例子说明了CUDA事件在GPU计时和CPU与GPU重叠执行方面的应用。 事件被插入到CUDA的调用流中。 由于CUDA流调用是异步的&#xff0c;CPU可以在GPU执行时进行计算&#xff08;包括主机和设备之间的DM…

【前端系列】前端如何使用websocket发送消息

序言 今天来学习一下前端如何使用websocket发送消息 1 基础介绍 1.1 什么是WebSocket WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议&#xff0c;它可以让客户端和服务器之间进行实时的双向通信。与传统的 HTTP 请求不同&#xff0c;WebSocket 使用了一个长连接&…

Django实现简单的音乐播放器 1

使用django框架开发一个简单的音乐播放器。 效果&#xff1a; 目录 环境准备 安装django 创建项目 创建应用 注册应用 配置数据库 设置数据库配置 设置pymysql库引用 创建数据库 创建数据表 生成表迁移文件 执行表迁移 配置时区 配置语言 配置子应用路由 在pla…

外部中断实验(stm32)

目录 EXIT的相关代码exit.cexit.h LED的相关代码KEY的相关代码BEEP的相关代码main.cGPIO 跟中断线的映射关系图 说明&#xff1a;以下内容参考正点原子资料 EXIT的相关代码 exit.c void EXTIX_Init(void) { EXTI_InitTypeDef EXTI_InitStructure;NVIC_InitTypeDef NVIC_InitS…

el-dialog中,el-form中表单信息未收集齐全时禁用提交按钮,动态控制按钮是否禁用

需求 在el-dialog中放置了一个表单&#xff0c;打开el-dialog时&#xff0c;表单没有收集内容&#xff0c;各项为空&#xff0c;此时表单的提交按钮被禁用&#xff0c;只有每个表单项都收集到内容时&#xff0c;才会将提交按钮设置为可用 预期效果 解决方案 <el-button c…

多线程进阶学习(高并发、线程池、使用场景)

文章目录 1、线程基础知识1.1、线程和进程线程和进程的区别&#xff1f; 1.2、并行与并发并行与并发有什么区别&#xff1f; 1.3、线程的创建方式创建线程的方式有哪些&#xff1f;刚才你说过&#xff0c;使用runnable和callable都可以创建线程&#xff0c;它们有什么区别呢&am…

OpenCV读取一张8位无符号三通道图像并显示

#include <iostream> #include <opencv2/imgcodecs.hpp> #include <opencv2/opencv.hpp> #include

Kafka生产者概述

【Kafka】Kafka生产者概述 文章目录 【Kafka】Kafka生产者概述1. 生产者1.1 生产者消息发送流程1.1.1 发送原理1.1.2 生产者重要参数列表 1.2 异步发送 API1.2.1 普通异步发送1.2.2 带回调函数的异步发送 1. 生产者 1.1 生产者消息发送流程 1.1.1 发送原理 在消息发送过程中…