All Downloads are FREE. Search and download functionalities are using the official Maven repository.

top.doudou.common.aop.aspect.AspectUtils Maven / Gradle / Ivy

package top.doudou.common.aop.aspect;

import com.google.common.collect.Maps;
import com.google.gson.Gson;
import org.apache.commons.collections.MapUtils;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.core.DefaultParameterNameDiscoverer;
import org.springframework.core.ParameterNameDiscoverer;
import org.springframework.validation.BindingResult;
import org.springframework.web.multipart.MultipartFile;
import top.doudou.core.builder.JsonBuilder;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.lang.reflect.Array;
import java.lang.reflect.Method;
import java.util.Collection;
import java.util.Map;
import java.util.function.Predicate;
import java.util.stream.IntStream;

/**
 * @author  傻男人<[email protected]>
 * @Date: 2020/8/21 13:25
 * @Version: 1.0
 * @Description: 切面的工具类
 */
public class AspectUtils {

    /**
     * 获取参数列表
     *
     * @param joinPoint
     * @return
     */
    public static Map getParameters(JoinPoint joinPoint) {
        Map result = Maps.newHashMap();
        ParameterNameDiscoverer pnd = new DefaultParameterNameDiscoverer();
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
        Method method = signature.getMethod();
        //参数名
        String[] parameterNames = pnd.getParameterNames(method);
        if(null == parameterNames || parameterNames.length == 0){
            return result;
        }
        //参数值
        Object[] args = joinPoint.getArgs();
        for (int i = 0; i < parameterNames.length; i++) {
            Object arg = args[i];
            result.put(parameterNames[i], !isIgnoreArgs(arg) ? arg : "[ignore]"+arg.getClass());
        }
        return result;
    }

    /**
     * 获取参数列表
     *
     * @param joinPoint
     * @return
     */
    public static Map getParameterStr(JoinPoint joinPoint) {
        Map result = Maps.newHashMap();
        ParameterNameDiscoverer pnd = new DefaultParameterNameDiscoverer();
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
        Method method = signature.getMethod();
        String[] parameterNames = pnd.getParameterNames(method);
        if(null == parameterNames || parameterNames.length == 0){
            return result;
        }
        Object[] args = joinPoint.getArgs();
        Gson gson = JsonBuilder.gson();
        for (int i = 0; i < parameterNames.length; i++) {
            Object arg = args[i];
            result.put(parameterNames[i], !isIgnoreArgs(arg) ? gson.toJson(arg) : "[ignore]"+arg.getClass());
        }
        return result;
    }

    /**
     * 获取参数列表
     *
     * @param joinPoint
     * @return
     */
    public static String getParametersToStr(JoinPoint joinPoint) {
        Map parameters = getParameters(joinPoint);
        return MapUtils.isNotEmpty(parameters) ? JsonBuilder.gsonNotSerializeNull().toJson(parameters) : "";
    }

    /**
     * 判断是否需要过滤的对象。
     *
     * @param object 对象信息。
     * @return 如果是需要过滤的对象,则返回true;否则返回false。
     */
    private static boolean isIgnoreArgs(Object object) {
        if(null ==  object){
            return false;
        }
        Class clazz = object.getClass();
        // 处理数组的情况
        if (clazz.isArray()) {
            return IntStream.range(0, Array.getLength(object))
                    .anyMatch(index -> isIgnoreArgs(Array.get(object, index)));
        }
        // 递归,处理数组、Collection、Map 的情况
        if (Collection.class.isAssignableFrom(clazz)) {
            return ((Collection) object).stream()
                    .anyMatch((Predicate) AspectUtils::isIgnoreArgs);
        }
        if (Map.class.isAssignableFrom(clazz)) {
            return isIgnoreArgs(((Map) object).values());
        }
        return object instanceof MultipartFile
                || object instanceof BindingResult
                || object instanceof HttpServletRequest
                || object instanceof HttpServletResponse;
    }
}