在项目中使用切面注解做数据脱敏时,导出的数据也需要脱敏处理,遇到了在一个类里面调用本类的方法切面失效,解决方法如下:
切面注解:
package com.t3.ts.driver.resume.aspect;
import java.lang.annotation.*;
/**
* @Description: 数据脱敏注解 Filed
* @Date: 2019/9/10
* @Author: wm yu
*/
@Inherited
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface EncryptField {
}
package com.t3.ts.driver.resume.aspect;
import java.lang.annotation.*;
/**
* @Description: 数据脱敏注解 Method
* @Date: 2019/9/10
* @Author: wm yu
*/
@Inherited
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface EncryptMethod {
}
切面类:
package com.t3.ts.driver.resume.aspect;
import com.alibaba.fastjson.JSON;
import com.t3.ts.driver.resume.utils.MD5Util;
import com.t3.ts.driver.resume.utils.StringUtils;
import com.t3.ts.driver.resume.utils.excel.FieldReflectionUtil;
import com.t3.ts.result.PageResult;
import com.t3.ts.result.Response;
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.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import java.lang.reflect.Field;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
/**
* @class_name: DecryptAspect
* @description:
* @author: wm_yu
* @create: 2019/09/10
**/
@Aspect
@Component
@Order(-1)
public class EncryptAspect {
private final static Logger log = LoggerFactory.getLogger(EncryptAspect.class);
/**
* 身份证脱敏正则 保留前后四位
*/
private final static String IDENTITY_CARD_DESENSITIZATION = "(?<=\\d{4})\\d(?=\\d{4})";
/**
*银行卡脱敏正则 保留前后四位
*/
private final static String BLANK_CARD_DESENSITIZATION = "(?<=\\d{4})\\d(?=\\d{4})";
/**
* 手机号脱敏正则 保留前三后四位
*/
private final static String MOBILE_DESENSITIZATION = "(?<=\\d{3})\\d(?=\\d{4})";
/**
* 定义其他字段脱敏长度
*/
private final static Integer OTHER_DESENSITIZATION_LENGTH = 3;
private final static Integer IDENTITY_CARD_LENGTH_18 = 18;
private final static Integer IDENTITY_CARD_LENGTH_15 = 15;
private final static Integer MOBILE_LENGTH = 11;
@Pointcut("@annotation(com.t3.ts.driver.resume.aspect.EncryptMethod)")
public void pointCut(){}
/**
* 注明切点
*/
@Around("pointCut()")
public Object around(ProceedingJoinPoint joinPoint){
Object responseObj = null;
try {
responseObj = joinPoint.proceed();
//数据脱敏
handleEncrypt(responseObj);
} catch (Throwable throwable) {
log.error("数据脱敏异常:{}", JSON.toJSONString(responseObj),throwable);
}
return responseObj;
}
/**
* 处理加密
*
* @param responseObj
*/
private void handleEncrypt(Object responseObj) throws IllegalAccessException {
if (!Optional.ofNullable(responseObj).isPresent()) {
return;
}
Object var = null;
if(responseO