一、加解密工具类方法
public class EncryptUtil {
public static String secretKeyB = "com.ooooooo.iiiissss.apitest@2023"; //密钥
private final static String DES = "DES"; //加解密方式,与前端协作,统一加密方式
//加密
public static String encrypt(String data) {
byte[] bt;
try {
bt = encrypt(data.getBytes(), secretKeyB.getBytes());
//加密
return Base64.getEncoder().encodeToString(bt);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
//解密
public static String decrypt(String data) {
if (data == null)
return null;
byte[] buf;
byte[] bt;
try {
//解密
buf = Base64.getDecoder().decode(data);
bt = decrypt(buf, secretKeyB.getBytes());
return new String(bt);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
二、定义注解
@Target({ ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
public @interface Encipher {
String value() default "dateJsonStr"; //用于指定接口接收的参数中,哪个参数是需要解密的
}
三、定义切面类
@Aspect
@Component
public class MyAspect {
@Around("@annotation(encipherAnnotation)") //使用环绕通知
public Object encipher(ProceedingJoinPoint proceedingJoinPoint, Encipher encipherAnnotation){
String value = encipherAnnotation.value(); //获取注解的value值
// 获取被代理对象
Object target = proceedingJoinPoint.getTarget();
// 获取通知签名
MethodSignature signature = (MethodSignature) proceedingJoinPoint.getSignature();
// 获取被代理方法
try {
Method pointMethod = target.getClass().getMethod(signature.getName(), signature.getParameterTypes());
//获取接口方法的参数列表
Parameter[] parameters = pointMethod.getParameters();
//这里获取的是前端请求接口的时候发送过来的参数列表
Object[] args = proceedingJoinPoint.getArgs();
//遍历请求参数列表
for (int i = 0; i < args.length; i++) {
Parameter parameter = parameters[i];
String argName = parameter.getName(); //获取到这个参数的参数名
if (value.equals(argName)){
//匹配解密的参数名,进行解密
String indexArgStr = String.valueOf(args[i]);
String jsonStr = EncryptUtil.decrypt(indexArgStr); //解密
//将解密后的数据给回到原来的参数位置
args[i] = jsonStr;
}
}
return proceedingJoinPoint.proceed(args); //调用并返回目标方法
} catch (NoSuchMethodException e) {
throw new RuntimeException(e);
} catch (Throwable e) {
throw new RuntimeException(e);
}
}
}
四、测试
@Operation(summary = "测试解密接口功能")
@ResponseBody
@Encipher(value = "dateJsonStr") //指定接口中哪个参数是需要解密的
@RequestMapping(value = "/test", method = RequestMethod.POST)
public CommonResult<User> getTest(String dateJsonStr, PageParamRequest pageParamRequest) {
//到这里后, dateJsonStr就是一个解密后的Json字符串,在这里进行Json串转换成对象,用于调用业务方法使用。
User user = JSONObject.parseObject(dateJsonStr, User.class);
return CommonResult.success(user);//这里直接返回解密后的数据
}
加密前的字符串(Json格式):
{"uid":"2","nickName":"妮妮","pwd":"123456"}
前端加密后的密文:
jeLoUBxkY3L6JqMr4+MMTFEe1jA+5hs8WVnSMv5HrHiamLk+k4UTqYVA5BgbAz6+
发送请求,获取到解密的结果: