自定义注解(一)——统一请求拦截

文章目录

    • 一、为什么会用到自定义注解
    • 二、关键参数说明
    • 三、应用场景示例:统一token认证
      • 1. 背景
      • 2. 自定义Token注解
      • 3. AOP上定义切面方法
      • 4. 方法上应用
      • 5. 总结

一、为什么会用到自定义注解

        自定义注解可以帮助我们更好地组织和管理代码,提高代码的可读性和可维护性,还能实现高效的代码复用和解耦。通过自定义注解,可以将相关的处理逻辑集中管理。例如,可以创建一个用于校验参数的注解,集中处理所有的参数校验逻辑,避免在每个方法中重复编写校验代码。随着项目的发展,可能需要引入新的功能或对现有功能进行调整。自定义注解使得这些扩展更加容易实现,只需添加或修改注解处理逻辑,无需修改使用了注解的类或方法,这样有助于开发出更加清晰、结构化的代码。

二、关键参数说明

在这里插入图片描述
@interface

声明annotation类别的@interface作为注解文件,区别于常用的class、interface和enum

@Retention

注解运行在哪一个时期的,总共有三种,分别是SOURCE、CLASS和RUNTIME
SOURCE:注解只在源代码中保留,编译阶段会被丢弃,不会写入字节码。如@Override、@SuppressWarnings等。
CLASS:注解在编译后被保留在字节码文件中,但在运行时环境中不会被虚拟机保留。这是默认的保留策略。
RUNTIME:注解在编译后被保留在字节码文件中,并且在运行时可以通过反射机制读取。这种类型的注解最为强大,从而执行一些运行时的逻辑处理。

@Target

注解用在哪上边,参数、方法、类…?

三、应用场景示例:统一token认证

1. 背景

    现在有一个需求是对项目中部分方法接口进行安全加密认证,不然接口不让访问!
    ① 最笨的一种方法是在每个方法块中都加上安全认证的逻辑,功能可以实现,就是太蠢了,一大堆的重复废代码!
    ② 常用的一种思路是通过拦截器进行拦截处理,在拦截器中加上安全认证的逻辑,然后把不需要安全认证的请求地址放开。
    ③ 还有一种思路就是借助自定义注解了,然后在切面AOP上加上安全认证的逻辑,这样只需要在对应的方法中加上注解即可,接下来就是对这种思路的具体实现。

2. 自定义Token注解

/*** token验证自定义注解*/
@Retention(RetentionPolicy.RUNTIME) // 注解运行在哪一个时期的
@Target(ElementType.METHOD) // 注解用在哪上边
public @interface Token {
}

3. AOP上定义切面方法

@Aspect
@Component
@Slf4j
public class TokenAspect {/*** 定义一个切入点,参数是定义在哪个包。哪个类、哪个方法切入,关于切入点如何定义* @annotation(此处放自定义注解的全路径)*/@Pointcut("@annotation(com.test.demo.annotation.Token)")public void pointFn() {}/*** 环绕通知pointFn方法,切面方法需要有返回值,来代替被代理方法返回结果* 只有加入@Token注解的方法,才会执行到当前切面方法中*/@Around("pointFn()")public Object around(ProceedingJoinPoint point) throws Throwable {// 从header头中获取token信息String token = ServletUtils.getRequest().getHeader("token");log.info("对带有了@Token注解的方法,做check检查");if (StringUtils.isEmpty(token)) {return R.error(10001, "token为空,请携带token");}//TODO 依据token做验证
//        // 如果token验证失败,则返回错误信息
//        if (false) {
//            return R.error(10002, "token验证失败");
//        }return point.proceed();}
}

ServletUtils.getRequest()就是获取HttpServletRequest的一个方法,可以按照自己的实际需求获取,此处用到的是如下方法获取的:

	public static HttpServletRequest getRequest() {RequestAttributes attributes = RequestContextHolder.getRequestAttributes();ServletRequestAttributes sra =  (ServletRequestAttributes) attributes;return sra.getRequest();}

4. 方法上应用

在这里插入图片描述

5. 总结

        这样,只要方法上加上了@Token注解,在执行该方法之前都会先执行TokenAspect类下的around方法,并对前端携带的token信息进行验证。如果前端没有传token信息或者token认证失败,则直接返回错误信息,如果认证成功,才能继续执行方法中的业务逻辑,可以有效避免在每个方法中重复编写token校验代码,提升代码的可维护性。

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

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

相关文章

IIS服务器更换即将过期的SSL证书

公司IIS服务器证书快要过期,替换证书的步骤: Winr输入mstsc命令,显示远程登录;输入服务器IP以及密码,进行远程登陆登陆IIS服务器,winr输入inetmgr命令显示IIS操控器;选择服务器证书--点击服务器…

Springboot引入swagger

讲在前面&#xff1a;在spring引入swagger时&#xff0c;由于使用的JDK、Spring、swagger 的版本不匹配&#xff0c;导致启动报错&#xff0c;一直存在版本依赖问题。所以在此声明清楚使用版本。JDK 1.8、Spring boot 2.6.13、 Swagger 2.9.2。 引入maven依赖 <dependency&…

神经射频脉冲术,破解疼痛之锁

一位十余年糖尿病病史的患者&#xff0c;右足开始出现疼痛和麻木的症状三个多月&#xff0c;给他的生活带来了极大的困扰。他曾在多家医院就诊&#xff0c;但治疗效果并不理想。直到他走进了北京精诚博爱医院&#xff0c;这里为他带来了希望和转机。 经过详细的检查&#xff0c…

数据比对步骤

##开发工作&#xff1a; 1&#xff0c;翻译代码写完&#xff08;中台生成dws结果&#xff09; 2&#xff0c;oracle结果导入CDH数据中台 3&#xff0c;编写比对SQL脚本 ##比对工作 1&#xff0c;寻找差异字段的原因&#xff1f;&#xff08;修正自己逻辑&#xff0c;修正宽表逻…

自己搭建的gitleb怎么更新购买的ssl证书

更新自己搭建的 GitLab 服务器的 SSL 证书通常涉及几个步骤&#xff0c;包括获取新的证书文件、替换旧证书文件&#xff0c;以及重新配置和重启 GitLab 服务。下面是一个详细的步骤指南&#xff1a; 步骤 1: 获取新的 SSL 证书和密钥文件 你需要有一个新的 SSL 证书&#xff…

开发环境解决跨域问题

跨域 为什么? 浏览器的同源策略(协议&#xff0c;域名&#xff0c;端口必须相等) http://localhost:9528/ &#xff08;前端页面&#xff09; ---------------------》后端接口&#xff08;https://heimahr.itheima.net/api&#xff09; 后端没有开启CORS 在后端没有开启CO…

VR紧急情况模拟|V R体验中心加盟|元宇宙文旅

通过VR技术实现紧急情况模拟&#xff0c;提升安全应急能力&#xff01; 简介&#xff1a;面对突发紧急情况&#xff0c;如火灾、地震、交通事故等&#xff0c;正确的反应和应对能够有效减少伤害和损失。为了提高人们在紧急情况下的应急能力&#xff0c;我们借助先进的虚拟现实…

Unittest单元测试框架之unittest_执行用例的详细信息

unittest_执行用例的详细信息 用unittest.main()执行测试集 这里的verbosity是一个选项,表示测试结果的信息复杂度&#xff0c;有三个值&#xff1a; 0 (静默模式): 你只能获得总的测试用例数和总的结果 比如 总共100个 失败20 成功801 (默认模式): 非常类似静默模式 只是在…

蓝桥杯 每天2题 day6

碎碎念&#xff1a;哇咔咔 要不是中间缺勤一天就圆满day7了&#xff01;最后一晚上&#xff01;写题复习哇咔咔 唉&#xff0c;睡了一觉就看不下去了&#xff0c;&#xff0c;&#xff0c;看看之前的笔记洗洗睡觉&#xff0c;&#xff0c;&#xff0c; 记得打印准考证带好东西…

华为改进点

华为公司可以在员工福利方面做出改进&#xff0c;提高员工的工作满意度和忠诚度。例如&#xff0c;可以增加员工福利&#xff0c;如提供更多灵活的工作时间、提供更好的培训和发展机会、加大健康保障和福利待遇等。 此外&#xff0c;华为公司也可以加强与客户的沟通与合作&…

快速掌握数据层内置持久化方案-jdbcTemplateSpringBoot内置数据库

环境准备 导入jdbc的起步依赖&#xff0c;mybatis的依赖中就存在jdbc的起步依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency>在配置文件中配置datasourse的…

使用腾讯云服务器如何搭建网站?新手建站教程

使用腾讯云服务器搭建网站全流程&#xff0c;包括轻量应用服务器和云服务器CVM建站教程&#xff0c;轻量可以使用应用镜像一键建站&#xff0c;云服务器CVM可以通过安装宝塔面板的方式来搭建网站&#xff0c;腾讯云服务器网txyfwq.com整理使用腾讯云服务器建站教程&#xff0c;…

RPA实战演练UiBot6.0新食堂一楼问卷星(类似于之前的网页表单提交)

要使用RPA&#xff08;Robotic Process Automation&#xff0c;机器人流程自动化&#xff09;帮助新食堂进行调查问卷&#xff0c;我们可以结合UiBot 6.0来实施具体的计划。以下是一个大致的实战演练计划&#xff1a; 一、目标与需求分析 明确调查目标&#xff1a;了解新食堂…

ThignsBoard通过服务端订阅共享属性

MQTT基础 客户端 MQTT连接 通过服务端订阅属性 案例 1、首先需要创建整个设备的信息&#xff0c;并复制访问令牌 ​​2、通过工具MQTTX连接上对应的Topic 3、测试链接是否成功 4、在MQTT上订阅对应的Topic 5、在客户端添加共享属性信息 6、查看整个设备的遥测数据 M…

SpringBoot的启动原理

运行Main方法&#xff1a; 应用程序启动始于Main方法的执行。在Main方法中&#xff0c;创建了一个SpringApplication实例&#xff0c;用于引导应用程序的启动。同时&#xff0c;SpringApplication会根据spring.factories文件加载并注册监听器、ApplicationContextInitializer等…

flinksql

Flink SQL 是 Apache Flink 项目中的一个重要组成部分,它允许开发者使用标准的 SQL 语言来处理流数据和批处理数据。Flink SQL 提供了一种声明式的编程范式,使得用户能够以一种简洁、高效且易于理解的方式来表达复杂的数据处理逻辑。 ### 背景 Flink SQL 的设计初衷是为了简…

Flutter Getx介绍

GetX 是 Flutter 上的一个轻量且强大的解决方案&#xff0c; Getx为我们提供了高性能的状态管理、智能的依赖注入和便捷的路由管理。以下视频对Flutter Getx做了全面的介绍。 51 【Getx 试听】Flutter Getx 状态管理介绍、Getx介绍 、Getx Dialog 主题管理 GetX 有3个基本原则…

AD7982BRMZRL7 二进制 500kSPS 模数转换芯片 ADI

AD7982BRMZRL7是一款由Analog Devices&#xff08;亚德诺&#xff09;公司生产的18位逐次逼近型模数转换器&#xff08;ADC&#xff09;。它主要用于将模拟信号转换为数字信号&#xff0c;适用于数据采集系统、嵌入式系统、工业控制和医疗设备等领域。 AD7982BRMZRL7的主要功能…

redis-缓存穿透与雪崩

一&#xff0c;缓存穿透&#xff08;查不到&#xff09; 在默认情况下&#xff0c;用户请求数据时&#xff0c;会先在缓存(Redis)中查找&#xff0c;若没找到即缓存未命中&#xff0c;再在数据库中进行查找&#xff0c;数量少可能问题不大&#xff0c;可是一旦大量的请求数据&a…

RocketMQ从安装、压测到运维一站式文档

1 RocketMQ下载方式 1.1 官网下载 下载地址 source是源码&#xff0c;Binary是可运行程序。 1.2 网盘下载 版本&#xff1a; 4.7.1版本的 source下载&#xff1a; 链接: https://pan.baidu.com/s/1d8FuAicxSr-YZKeeQJ7jWg 提取码: t24m Binary下载&#xff1a; 链接: …