自定义注解&& 登录校验&& 打印日志

  • @documented //作用域
  • @Inherited //是否可被子类继承
  • @Target({ElementType.ANNOTATION_TYPE,ElementType.METHOD,ElementType.FIELD}) //适用范围
  • @Retention(RetentionPolicy.RUNTIME) //是否在运行时被VM保留

适用案例: 登录校验

  • 定义一个注解
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD,ElementType.METHOD})
public @interface LoginInterceptorAnnotation {

}
  • 创建一个登录拦截器
public class SourceAccessInterceptor implements HandlerInterceptor {


    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("进入拦截器了");

        HandlerMethod handlerMethod = (HandlerMethod)handler;

        Method method = handlerMethod.getMethod();

		//判断方法上是否打标签
        LoginInterceptorAnnotation annotation = method.getAnnotation(LoginInterceptorAnnotation.class);


        if(annotation == null){
            System.out.println("不需要登录校验");
            return true;
        }

        Map<String, String[]> parameterMap = request.getParameterMap();


//        // 有LoginRequired注解说明需要登录,提示用户登录
//        response.setContentType("application/json; charset=utf-8");
//        response.getWriter().print("你访问的资源需要登录");
//        return false;

        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("进入拦截器了2");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("进入拦截器了3");
    }
}
  • 将拦截器加入拦截器队列中
  • 添加pom文件
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>
@Configuration
public class InterceptorTrainConfigurer implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new SourceAccessInterceptor()).addPathPatterns("/**");
    }
}
  • test 测试类
    //  http://localhost:8081/com/hello?seller=1
    @RequestMapping(value = "/hello",method = {RequestMethod.GET})
    @ResponseBody
    @LoginInterceptorAnnotation
    public String getMethodName(String sellerId) {
        return "lhy_test";
    }

适用案例: 打印方法日志

  • 创建注解
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD,ElementType.METHOD})
public @interface MyLogAnnotation {
}

  • 实现注解方法:
@Aspect
@Component
public class LogAspect {

    @Pointcut(value = "@annotation(com.lhy.logininterceptor.MyLogAnnotation)")
    public void logPointCut(){}


    @Around(value = "logPointCut()")
    public void pointCutAround(ProceedingJoinPoint point){

        String methodName = point.getSignature().getName();


        Object[] param = point.getArgs();


        StringBuilder sb = new StringBuilder();
        for(Object o : param){
            sb.append(o).append("; ");
        }


        // 继续执行方法
        long timeMillis = System.currentTimeMillis();
        try {
            System.out.println("开始执行方法");
            Object proceed = point.proceed();
            System.out.println(proceed);
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }

        System.out.println("进入[" + methodName + "]方法,参数为:" + sb.toString()+"   方法总耗时:"+(System.currentTimeMillis()-timeMillis));

        System.out.println(methodName + "方法执行结束");


    }

}
  • test 测试方案:
    @RequestMapping(value = "/hello2",method = {RequestMethod.GET})
    @ResponseBody
    @MyLogAnnotation
    public String getMethodLog(String sellerId) {
        
        return "cwp_test";
    }
  • 打印日志另一种实现
/**
 * aop log
 */
@Component
@Order(Ordered.HIGHEST_PRECEDENCE)
@Aspect
public class ServiceAspect {
    private static final Logger bizServiceLogger = LoggerFactory.getLogger("bizServiceLog");
    private static final Logger bizParamLogger = LoggerFactory.getLogger("bizParamLog");

    private static SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    private static final String LOG_DELIMITER = "|";
    private static final String APP_NAME = "app";
    private final AtomicInteger count = new AtomicInteger(0);

    @Around("execution(* com.api.facade..*.*(..))")
    public Object doAroundMethod(ProceedingJoinPoint pig) throws Throwable {
        Object obj = null;
        long startTime = System.currentTimeMillis();
        try {
            //print arg
            this.before(pig);
            obj = pig.proceed();
        } catch (Throwable e) {
            long endTime = System.currentTimeMillis();
            bizServiceLogger.error("aop is Exception " + ExceptionUtils.getStackTrace(e));
            //print result
            printBizServiceLog(pig, obj, endTime - startTime);
            throw e;
        }
        long endTime = System.currentTimeMillis();
        try {
            //print result
            printBizServiceLog(pig, obj, endTime - startTime);
        } catch (Exception e) {
            bizServiceLogger.error("print aopBizLog error", e);
        }

        return obj;
    }

    //print args
    private void before(ProceedingJoinPoint pig) {
        Method method = ((MethodSignature) pig.getSignature()).getMethod();
        List<String> inParams = formatParams(pig, method);
        String aopMethodArgsLimit = OpenCloseSwitch.aopMethodArgsLimit;
        boolean contains = aopMethodArgsLimit.contains(method.getName());

        if (MtopContext.getApi() != null) {
            String mtopApi = MtopContext.getApi();
            if (contains || !OpenCloseSwitch.aopParamLog) {
                bizParamLogger.debug(String.format("API_Name:[%s], MethodName:[%s.%s],TraceId:[%s], MethodArgs:[%s]",
                        mtopApi,
                        pig.getTarget().getClass().getSimpleName(),
                        method.getName(),
                        EagleEye.getTraceId(),
                        StringUtils.join(inParams, ",")));
            } else {
                bizParamLogger.info(String.format("API_Name:[%s], MethodName:[%s.%s],TraceId:[%s], MethodArgs:[%s]",
                        mtopApi,
                        pig.getTarget().getClass().getSimpleName(),
                        method.getName(),
                        EagleEye.getTraceId(),
                        StringUtils.join(inParams, ",")));
            }
        } else {
            if (contains || !OpenCloseSwitch.aopParamLog) {
                bizParamLogger.debug(String.format("MethodName:[%s.%s],TraceId:[%s], MethodArgs:[%s]",
                        pig.getTarget().getClass().getSimpleName(),
                        method.getName(),
                        EagleEye.getTraceId(),
                        StringUtils.join(inParams, ",")));
            } else {
                bizParamLogger.info(String.format("MethodName:[%s.%s],TraceId:[%s], MethodArgs:[%s]",
                        pig.getTarget().getClass().getSimpleName(),
                        method.getName(),
                        EagleEye.getTraceId(),
                        StringUtils.join(inParams, ",")));
            }
        }
    }

    private List<String> formatParams(ProceedingJoinPoint pig, Method method) {
        Object[] args = pig.getArgs();
        List<String> paramList = new ArrayList<String>();
        try {
            Parameter[] parameters = pig.getTarget().getClass().getMethod(method.getName(), method.getParameterTypes()).getParameters();
            for (int i = 0; i < args.length; i++) {
                if (args[i] instanceof ServletRequest || args[i] instanceof ServletResponse || args[i] instanceof MultipartFile || args[i] instanceof ServletServerHttpRequest || args[i] instanceof ServletServerHttpResponse) {
                    //exclude cant serialize
                    continue;
                }
                paramList.add(parameters[i].getName() + ":" + JSONObject.toJSONString(args[i]));
            }
        } catch (Exception e) {
            bizServiceLogger.error("aop formatParams is error", e);
        }
        return paramList;
    }

    //print result
    private void printBizServiceLog(ProceedingJoinPoint pig, Object resultObj, long costTime) {
        StringBuilder sb = new StringBuilder();

        String simpleClassName = pig.getTarget().getClass().getSimpleName();
        Method method = ((MethodSignature) pig.getSignature()).getMethod();
        String methodName = method.getName();
        String className = method.getDeclaringClass().getName();

        String ip = getHostIp();
        sb.append(LOG_DELIMITER).append("bizServiceLog");
        sb.append(LOG_DELIMITER).append(dateFormatter.format(new Date()));
        //traceId
        sb.append(LOG_DELIMITER).append(EagleEye.getTraceId());
        //rpcId
        sb.append(LOG_DELIMITER).append(EagleEye.getRpcId());
        sb.append(LOG_DELIMITER).append(APP_NAME);
        //calssName
        sb.append(LOG_DELIMITER).append(simpleClassName);
        //MethodName
        sb.append(LOG_DELIMITER).append(methodName);
        //costTime
        sb.append(LOG_DELIMITER).append(costTime);

        Result result = convertResult(resultObj);

        //result
        sb.append(LOG_DELIMITER).append(result.isSuccess());
        //code
        sb.append(LOG_DELIMITER).append(result.isSuccess() ? "success" : result.getErrorCode());
        //msg
        sb.append(LOG_DELIMITER).append(result.isSuccess() ? "success" : result.getErrorMsg());
        //is ya ce
        sb.append(LOG_DELIMITER).append("1".equals(EagleEye.getUserData("t")) ? "1" : "0");
        sb.append(LOG_DELIMITER).append(ip);
        //order
        sb.append(LOG_DELIMITER).append(count);

        if (!OpenCloseSwitch.aopLog) {
            bizServiceLogger.debug(sb.toString());
        } else {
            bizServiceLogger.info(sb.toString());
        }
    }


    private Result convertResult(Object resultObj) {
        Result result = new Result();
        if (resultObj == null) {
            result.setSuccess(false);
            result.setErrorCode(ServiceCode.AOP_EXCEPTION.getCode());
            result.setErrorMsg(ServiceCode.AOP_EXCEPTION.getMsg());
            return result;
        }

        if (resultObj instanceof Result) {
            return (Result) resultObj;
        }
        result.setSuccess(true);
        result.setErrorCode(ServiceCode.AOP_NOT_EXIST_RESULT.getCode());
        result.setErrorMsg(ServiceCode.AOP_NOT_EXIST_RESULT.getMsg());
        return result;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值