一:介绍
二:方法
2.1 定义注解
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| package com.tohours.cnTools.annotation;
import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;
/** * @desc 解密的注解 * @author RenJie */ @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.TYPE,ElementType.METHOD}) //可以定义在类和方法上 @Documented public @interface Decrypt { }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| package com.tohours.cnTools.annotation;
import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;
/** * @desc 加密 * @author RenJie * */ @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.TYPE,ElementType.METHOD}) //可以定义在类和方法上 public @interface Encrypt { }
|
2.2 定义是否加解密开关
1 2 3
| # 是否对接口进行加解密处理 isDecrypt: true # 是否解密 isEncrypt: true # 是否加密
|
2.3 定义切面
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
| package com.tohours.cnTools.aspect;
import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Pointcut; import org.aspectj.lang.reflect.MethodSignature; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component;
import com.tohours.cnTools.utils.AesJsUtils;
import lombok.extern.slf4j.Slf4j;
/** * @desc 加解密 API日志切面 * @Date 2022-10-13 */ @Slf4j @Aspect @Component public class DecryptAspect {
//是否解密 @Value("${isDecrypt}") private Boolean isDecrypt;
/** * 以自定义 @Secret 注解为切点 */ @Pointcut("@within(com.tohours.cnTools.annotation.Decrypt) || @annotation(com.tohours.cnTools.annotation.Decrypt)") public void decrypt() { }
@Around("decrypt()") public Object around(ProceedingJoinPoint joinPoint) throws Throwable { // 获取参数名称和值 Object[] args = joinPoint.getArgs(); if(isDecrypt) { MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature(); String[] parameterNames = methodSignature.getParameterNames(); for (int i = 0; i < parameterNames.length; i++) { if (i >= args.length) { break; } Object value = args[i]; String name = parameterNames[i]; log.info("name:" + name); log.info("value:" + value); args[i] = AesJsUtils.decrypt(value.toString()); } } //执行方法 Object result = joinPoint.proceed(args); return result; } }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
| package com.tohours.cnTools.aspect;
import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Pointcut; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.tohours.cnTools.support.TohoursResponse; import com.tohours.cnTools.support.TohoursResult; import com.tohours.cnTools.utils.AesJsUtils;
import lombok.extern.slf4j.Slf4j;
/** * @desc 加解密 API日志切面 * @Date 2022-10-13 */ @Slf4j @Aspect @Component public class EncryptAspect { //是否加密 @Value("${isEncrypt}") private Boolean isEncrypt;
/** * 以自定义 @Secret 注解为切点 */ @Pointcut("@within(com.tohours.cnTools.annotation.Encrypt) || @annotation(com.tohours.cnTools.annotation.Encrypt)") public void encrypt() { }
@Around("encrypt()") public Object around(ProceedingJoinPoint joinPoint) throws Throwable { //执行方法 Object result = joinPoint.proceed(); if(isEncrypt) { log.info("加密处理前:" + result); JSONObject rv = JSONObject.parseObject(JSON.toJSONString(result)); Object resData = rv.get("resData"); String encrypt = AesJsUtils.encrypt(resData.toString()); TohoursResult<Object> success = TohoursResponse.success(encrypt); return success; }else { return result; } } }
|
2.4 Controller层
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| package com.tohours.cnTools.controller.test;
import java.util.UUID;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController;
import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.tohours.cnTools.annotation.Decrypt; import com.tohours.cnTools.annotation.Encrypt; import com.tohours.cnTools.controller.BaseController; import com.tohours.cnTools.model.DirectChargeModel; import com.tohours.cnTools.support.TohoursResponse; import com.tohours.cnTools.support.TohoursResult; import com.tohours.cnTools.utils.cq.CQUtils;
import lombok.extern.slf4j.Slf4j;
@RestController @RequestMapping("/cq") @SuppressWarnings("rawtypes") @Slf4j public class CQTestController extends BaseController {
@RequestMapping(value = "test") @Decrypt @Encrypt public TohoursResult<Object> test(String test) { log.info("test:" + test); return TohoursResponse.success(test); } }
|
1 2 3 4 5
| @Decrypt @Encrypt 这两个注解可以定义到方法上也可以定义到类上, 如果这个Controller的都需要进行加解密则统一 可以放在类上
|
*************感谢您的阅读*************