使用AOP技术对返回值进行解密处理,下面是示例代码:
统一返回值对象类:
public class Result {
private int code;
private String msg;
private Object data;
// 省略...
// getter/setter...
}
自定义加解密类:
@Component
public class MyPasswordEncoder {
private final String secret = "my_secret_key";
// 加密
public String encode(String str) {
byte[] bytes = str.getBytes(StandardCharsets.UTF_8);
byte[] key = secret.getBytes(StandardCharsets.UTF_8);
SecretKeySpec secretKeySpec = new SecretKeySpec(key, "AES");
try {
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);
byte[] result = cipher.doFinal(bytes);
return Base64.getEncoder().encodeToString(result);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
// 解密
public String decode(String str) {
byte[] bytes = Base64.getDecoder().decode(str);
byte[] key = secret.getBytes(StandardCharsets.UTF_8);
SecretKeySpec secretKeySpec = new SecretKeySpec(key, "AES");
try {
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.DECRYPT_MODE, secretKeySpec);
byte[] result = cipher.doFinal(bytes);
return new String(result, StandardCharsets.UTF_8);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
AOP切面类:
@Component
@Aspect
public class DecryptAspect {
@Autowired
private MyPasswordEncoder myPasswordEncoder;
@Pointcut("execution(public * com.example.demo.controller..*.*(..))")
public void decrypt() {
}
@Around("decrypt()")
public Object doAround(ProceedingJoinPoint pjp) throws Throwable {
Object[] args = pjp.getArgs();
Object result = pjp.proceed(args); // 执行业务方法
if (result instanceof Result) { // 判断返回值类型为Result
Result r = (Result) result;
Object data = r.getData();
if (data instanceof String) { //