spring切面注解失效

在项目中,使用Spring AOP切面注解进行数据脱敏,发现在类内部调用自身方法时切面失效。问题在于多线程环境下,this指向的是原始对象而非代理对象。解决方法是通过Spring的`@Component`注解创建代理对象,并在需要的地方注入,从而确保AOP能够生效。在代码调试中可以观察到,采用此方法后能正确获取到CGLIB代理对象。
摘要由CSDN通过智能技术生成

在项目中使用切面注解做数据脱敏时,导出的数据也需要脱敏处理,遇到了在一个类里面调用本类的方法切面失效,解决方法如下:

切面注解:

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值