java中springaop实现对参数加解密

1,前置逻辑我就不写了,只给出关键性代码

可以直接切postMapping这个注解,然后获取入参,然后执行下面代码,
后续我会给出完整的代码

2.工具类


import com.example.study.annotation.Encryption;
import com.example.study.entity.User;
import com.example.study.entity.User1;
import com.example.study.entity.User2;

import java.lang.reflect.Field;
import java.util.Arrays;
import java.util.Collection;
import java.util.Map;

public class EncryptionUtils {
   
   

    public static void main(String[] args) {
   
   
        /**
         * @Data
         * public class User {
         *     @Encryption
         *     private String name;
         *     private Integer age;
         *     @Encryption
         *     private List<User1> users;
         *     @Encryption
         *     private User2 user2;
         * }
         *
         * @Data
         * public class User1 {
         *     @Encryption
     
Java 项目中(尤其是 Spring Boot 应用),可以使用 **AOP(面向切面编程)** 来实现对响应数据的统一加解密处理。这种方式可以避免在每个接口中重复编写加解密逻辑,实现接口数据处理的**统一性和可维护性**。 --- ### ✅ 实现思路 1. 使用 `@ControllerAdvice` 或 `@Aspect` 拦截所有 Controller 的响应。 2. 对返回的数据进行加密(如使用 AES)。 3. 对请求参数进行解密(如果需要)。 4. 可结合自定义注解,控制哪些接口需要加解密。 --- ### ✅ 示例代码 #### 1. 自定义注解(用于标记需要加解密的接口) ```java import java.lang.annotation.*; @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface EncryptDecryptResponse { } ``` #### 2. AOP 切面类(处理加解密) ```java import com.fasterxml.jackson.databind.ObjectMapper; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.springframework.stereotype.Component; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.BufferedReader; import java.io.InputStreamReader; @Aspect @Component public class EncryptDecryptAspect { private final ObjectMapper objectMapper = new ObjectMapper(); private static final String KEY = "1234567890123456"; // AES 密钥 // 拦截所有带有 @EncryptDecryptResponse 注解的方法 @Around("@annotation(EncryptDecryptResponse)") public Object handleEncryptDecrypt(ProceedingJoinPoint joinPoint) throws Throwable { Object result = null; HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); HttpServletResponse response = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse(); try { // 读取请求体(用于解密) BufferedReader reader = new BufferedReader(new InputStreamReader(request.getInputStream())); StringBuilder requestBody = new StringBuilder(); String line; while ((line = reader.readLine()) != null) { requestBody.append(line); } // 解密请求体(假设是加密的 JSON) String decryptedData = AESUtil.decrypt(requestBody.toString(), KEY); // 将解密后的数据重新设置到 request 中(需自定义处理方式) // 执行原始方法 result = joinPoint.proceed(); // 加密返回结果 String resultJson = objectMapper.writeValueAsString(result); String encryptedResult = AESUtil.encrypt(resultJson, KEY); // 写入加密后的结果到 response response.setContentType("application/json;charset=UTF-8"); response.getWriter().write(encryptedResult); return null; // 避免重复返回 } catch (Exception e) { e.printStackTrace(); // 异常处理 return "加密/解密失败"; } } } ``` #### 3. AES 工具类(参考) ```java import javax.crypto.Cipher; import javax.crypto.spec.SecretKeySpec; import java.util.Base64; public class AESUtil { private static final String ALGORITHM = "AES"; public static String encrypt(String value, String key) throws Exception { Cipher cipher = Cipher.getInstance(ALGORITHM); SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(), ALGORITHM); cipher.init(Cipher.ENCRYPT_MODE, keySpec); byte[] encrypted = cipher.doFinal(value.getBytes()); return Base64.getEncoder().encodeToString(encrypted); } public static String decrypt(String encrypted, String key) throws Exception { Cipher cipher = Cipher.getInstance(ALGORITHM); SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(), ALGORITHM); cipher.init(Cipher.DECRYPT_MODE, keySpec); byte[] decoded = Base64.getDecoder().decode(encrypted); return new String(cipher.doFinal(decoded)); } } ``` --- ### ✅ 使用方式 ```java @RestController public class UserController { @EncryptDecryptResponse @PostMapping("/user") public User getUser(@RequestBody String encryptedData) { // 业务逻辑(数据已由 AOP 解密) return new User("张三", 25); } } ``` --- ### ✅ 优点 - 统一处理加解密逻辑,减少重复代码。 - 可通过注解灵活控制是否启用加解密。 - 便于后期扩展,如支持 RSA、签名验证等。 --- ### ✅ 注意事项 - 加解密过程会影响性能,建议仅对敏感数据进行加密。 - 密钥管理需谨慎,避免硬编码。 - 若需处理请求参数解密,可能需要自定义 `HttpMessageConverter`。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值