SpringBoot自定义注解使用AOP实现请求参数解密以及响应数据加密

本文展示了如何在SpringBoot中利用AOP和自定义注解@Secret实现请求参数解密及响应数据加密。通过在Controller类或方法上使用@Secret注解,AOP切面会在接口执行前后处理加密解密逻辑。文章包括创建项目、定义注解、Controller使用、AOP切面实现以及执行效果的详细步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SpringBoot自定义注解使用AOP实现请求参数解密以及响应数据加密

一、前言

本篇文章将依托与SpringBoot平台,自定义注解用来标识接口请求是否实现加密解密。使用AOP切面来具体操作解密加密,实现对源代码的低耦合,不在原基础上做很大的改动。

本篇文章的所有示例,都上传到我的github中,欢迎大家拉取测试,欢迎star github

实现要求:

  1. 自定义一个注解@Secret,用来标识需要实现加密解密
    • 作用在Controller类上,表示此Controller类的所有接口都实现加密解密
    • 作用来单一方法上,表示此接口方法需要实现加密解密
  2. 使用AOP切面编程实现
    • 在接口方法执行之前将前端的加密参数解密并重新赋给接口参数
    • 在接口方法响应之后,将返回的数据进行加密返回
  3. 在配置文件中配置,是否开启全局的加密解密操作

实现流程:
在这里插入图片描述

  1. 前端请求的接口将请求参数json通过AES加密生成加密字符串,然后将加密字符串通过名为encyptStr字段传递给后端。
  2. AOP前置方法拦截,将encyptStr字符串通过AES解密得到原始请求参数json,将json映射为请求方法的参数对象User。
  3. 接口通过参数成功响应,并将响应数据直接返回。
  4. AOP后置方式拦截,将响应参数data字段里的数据AES加密,并返回给前端
  5. 前端收到请求响应,通过code判断请求是否成功,AES加密data字段得到需要的数据。

二、实现操作

1. 创建SpringBoot项目

创建一个SpringBoot项目,导入必要的maven依赖。

  • 使用AOP切面需要导入AOP的启动器
  • lombok是一个通过注解简化代码的工具,在idea中使用需要安装lombok插件
  • json转换工具,apache工具类

pom.xml

<!-- web依赖 -->
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-web</artifactId>
</dependency>

<!-- AOP切面依赖 -->
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-aop</artifactId>
</dependency>

<!-- lombok工具 -->
<dependency>
	<groupId>org.projectlombok</groupId>
	<artifactId>lombok</artifactId>
	<optional>true</optional>
</dependency>

<!-- json操作类 -->
<dependency>
	<groupId>com.alibaba</groupId>
	<artifactId>fastjson</artifactId>
	<version>1.2.52.sec06</version>
</dependency>
<!-- String工具包 -->
<dependency>
	<groupId>org.apache.commons</groupId>
	<artifactId>commons-lang3</artifactId>
	<version>3.9</version>
</dependency>
2. 自定注解@Secret

我们通过自定义的注解,来标识类或接口,告诉AOP哪些类或方法需要执行加密解密操作,更加的灵活。

Secret.java

package com.agger.springbootaopdemo.annotation;

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

/**
 * @classname: Secret
 * @description: 自定义注解,用来标识请求类 或者方法是否使用AOP加密解密
 * @author chenhx
 * @date 2019-12-05 13:48:03
 */
@Target({
   ElementType.TYPE,ElementType.METHOD})              // 可以作用在类上和方法上
@Retention(RetentionPolicy.RUNTIME)                               // 运行时起作用
public @interface Secret {
   

    // 参数类(用来传递加密数据,只有方法参数中有此类或此类的子类才会执行加解密)
    Class value();

    // 参数类中传递加密数据的属性名,默认encryptStr
    String encryptStrName() default "encryptStr";
}

自定义注解很简单,只需要确定注解的作用位置和运行时机。其中有两个变量value和encryptStrName。
value没有默认值,是必传的参数,用来表示需要加解密的参数类或父类。AOP中或用到。
encryptStrName默认值为"encryptStr",用来表示前端传递的加密参数名称是什么,value类中必须存在此字段

3. Controller中使用

定义好@Secret注解后,我们就可以在Controller中使用了,不过现在只相当于是一个标注,还没有起任何作用,需要我们再定义好AOP后才会起作用。

  1. @Secret注解作用来类上

UserController.java

package com.agger.springbootaopdemo.controller;

import com.agger.springbootaopdemo.annotation.Secret;
import com.agger.springbootaopdemo.vo.BaseVO
好的,针对您的问题,我可以给您一些简单的解释。 SpringBoot中的AOP(面向切面编程)可以帮助我们对方法进行拦截和增强,这样我们就可以在方法执行前后进行一些自己想要的操作,比如接口的请求数据解密和返回数据加密。 具体来说,我们可以通过定义一个切面类,在其中定义一个前置通知和一个后置通知。前置通知可以在方法执行前进行解密操作,后置通知可以在方法执行后进行加密操作。 下面是一个简单的示例代码: ```java @Aspect @Component public class EncryptAspect { @Autowired private EncryptService encryptService; @Pointcut("execution(public * com.example.controller.*.*(..))") public void encrypt() {} @Before("encrypt()") public void doEncrypt(JoinPoint joinPoint) { Object[] args = joinPoint.getArgs(); for (Object arg : args) { if (arg instanceof String) { String decrypted = encryptService.decrypt((String) arg); // 将解密后的数据重新设置到参数中 // ... } } } @AfterReturning(value = "encrypt()", returning = "result") public void doDecrypt(JoinPoint joinPoint, Object result) { if (result instanceof String) { String encrypted = encryptService.encrypt((String) result); // 将加密后的数据返回 // ... } } } ``` 在上面的示例代码中,我们定义了一个切面类`EncryptAspect`,其中通过`@Pointcut`注解定义了需要拦截的方法,即`com.example.controller`包下的所有方法。在`doEncrypt`方法中,我们可以获取到方法的参数,并进行解密操作;在`doDecrypt`方法中,我们可以获取到方法的返回值,并进行加密操作。 需要注意的是,上面的示例代码中的`EncryptService`是一个加解密服务的接口,具体的加解密实现可以根据自己的需求进行编写。 希望以上解释可以帮助到您。如果还有其他问题,欢迎随时提出。
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值