@Aspect参数获取

2,021 阅读1分钟

通知参数处理

@Aspect //自定义注解
@Component //泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。
@Slf4j
public class LogServiceAspect {
    @Autowired
    private LogService logService;

    @Around("execution(* com.zrar.ai.controller.WebController.*(..)) && @annotation(com.zrar.ai.annotation.Log)")
    public  Object  addLog(ProceedingJoinPoint jp) throws Throwable {
        Object result;
        //获取方法参数
        MethodSignature signature = (MethodSignature) jp.getSignature();
        //获取方法地址
        Method method1 = signature.getMethod();
        //获取地址内容,即名称
        String method = method1.getName();
        //获取切入点@Log注解
        Log annotation = method1.getAnnotation(Log.class);
        //获取注解内容
        String description = annotation.value();
        //访问来源ip
        String ip = getIpAddress();
        //准备参数
        StringBuilder params = new StringBuilder("{");
        //参数值
        Object[] argValues = jp.getArgs();
        //参数名称
        String[] argNames = ((MethodSignature)jp.getSignature()).getParameterNames();
        //对应放一起
        if(argValues != null){
            for (int i = 0; i < argValues.length; i++) {
                params.append(" ").append(argNames[i]).append(": ").append(argValues[i]);
            }
        }
        String  parameters = params.toString()+"}";
        //切入时间
        long befTime = System.currentTimeMillis();
        //运行切入对象,拦截返回值
        result = jp.proceed();
        //获取当前时间
        long nowTime = System.currentTimeMillis();
        //转换时间格式
        Date date = new Date(nowTime);
        //运行时间
        Long cost =nowTime-befTime;
        //保存日志
        logService.addLog(method,ip,parameters,description,cost,date);
        //将拦截的返回值传到前端
        return result;
    }

    /**
     * 获取ip
     * @return
     */
    public static String getIpAddress() {
        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
        String ip = request.getHeader("x-forwarded-for");
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("Proxy-Client-IP");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("WL-Proxy-Client-IP");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("HTTP_CLIENT_IP");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("HTTP_X_FORWARDED_FOR");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getRemoteAddr();
        }
        return ip;
    }
}
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
public @interface Aspect {
    String value() default "";
}