Springboot Aop日志妙用

本文介绍了一个基于AOP(面向切面编程)的日志记录和权限验证的具体实现。通过定义切入点和切面,实现了对指定方法的日志记录及参数检查,并通过自定义注解方式对控制器的方法进行权限验证。

这个是自定义注解

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface AuthChecker {

}
@Component  //声明组件
@Aspect //  声明切面
public class LogAop extends BaseController {

    /**
     * 自定义日志
     */
    private Logger logger = LoggerFactory.getLogger(LogAop.class);

    /**
     * 功能描述 service切面
     *
     * @param * @param
     * @return void
     * @author
     * @date 2021/6/9
     */
	//定义一个切入点
    @Pointcut("execution(public * com.esp.espplay.play.service.impl.*.*(..))")
    public void webLog() {

    }

    long startTime = System.currentTimeMillis();

    @Before("webLog()")
    public void doBefore(JoinPoint point) {
        logger.info("方法" + point.getSignature().getDeclaringTypeName() + "." + point.getSignature().getName() + "执行开始");
        logger.info("入参为"+ JSON.toJSONString(((MethodSignature)point.getSignature()).getParameterNames())+" : "+ JSON.toJSONString(point.getArgs()));
    }
//    @After("webLog()")
//    public void doAfter(JoinPoint point){
//        logger.info(System.currentTimeMillis()-startTime/1000f +"秒!"+"----------------------");
//    }

    /**
     * 功能描述 controller切面
     *这个是通过注解实现的
     * @param * @param
     * @return void
     * @author
     * @date 2021/6/9
     */
    @Pointcut("@annotation(com.esp.espplay.play.aop.AuthChecker)")
    public void webContro() {

    }
     /**
     * 功能描述 controller切面
     *
     * @param * @param
     * @return void
     * @author
     * @date 2021/6/9
     */
    @Pointcut("execution(public * com.esp.espplay.play.controller.*.*(..))")
    public void webController() {

    }

    // 定义 advise
    @Around("webContro()")
    public ResponseEntity<ResultModel> checkAuth(ProceedingJoinPoint joinPoint) throws Throwable {
        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes())
                .getRequest();

        // 检查用户所传递的 token 是否合法
        String token = getUserToken(request);
        if (!token.equalsIgnoreCase("123456")) {
            return responseEntity("错误, 权限不合法!");
        }

        return responseEntity(joinPoint.proceed());
    }

    private String getUserToken(HttpServletRequest request) {
        Cookie[] cookies = request.getCookies();
        if (cookies == null) {
            return "";
        }
        for (Cookie cookie : cookies) {
            if (cookie.getName().equalsIgnoreCase("token")) {
                return cookie.getValue();
            }
        }
        return "";
    }
   @Before("webController()")
   public void doBeforeController(JoinPoint point) {
       logger.info("方法" + point.getSignature().getDeclaringTypeName() + "." + point.getSignature().getName() + "执行开始");
       logger.info("入参为"+ JSON.toJSONString(((MethodSignature)point.getSignature()).getParameterNames())+" : "+ JSON.toJSONString(point.getArgs()));
   }

}

效果图
在这里插入图片描述

### Spring Boot 中使用 AOP 实现日志记录的最佳实践 在 Spring Boot 应用中,AOP 是一种非常有效的工具,可用于实现跨切关注点的功能,如日志记录、性能监控等。以下是基于最佳实践的日志记录实现方案。 #### 1. 添加必要的依赖 为了支持 Web 功能和 AOP 的使用,需要引入 `spring-boot-starter-web` 和 `spring-boot-starter-aop` 这两个依赖[^1]: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> ``` #### 2. 创建自定义注解 创建一个自定义注解,用于标记需要记录日志的方法。这种方式可以让开发者更清晰地控制哪些方法会被拦截并记录日志[^3]。 ```java import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface Loggable { } ``` #### 3. 定义切面类 通过切面类捕获带有 `@Loggable` 注解的方法,并在其执行前、后或其他阶段插入日志记录逻辑。这里展示了如何利用前置通知、后置通知以及异常通知来完成完整的日志记录功能[^4]。 ```java import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; @Aspect @Component public class LoggingAspect { private static final Logger logger = LoggerFactory.getLogger(LoggingAspect.class); // 切入点表达式,匹配所有标注了 @Loggable 的方法 @Pointcut("@annotation(com.example.demo.Loggable)") public void loggableMethods() {} // 前置通知:在方法执行前打印进入信息 @Before("loggableMethods()") public void beforeAdvice() { logger.info("Entering method..."); } // 后置返回通知:在方法成功完成后打印退出信息 @AfterReturning(pointcut = "loggableMethods()", returning = "result") public void afterReturningAdvice(Object result) { logger.info("Method executed successfully with result: {}", result); } // 异常通知:在方法抛出异常时打印错误信息 @AfterThrowing(pointcut = "loggableMethods()", throwing = "ex") public void afterThrowingAdvice(Exception ex) { logger.error("Exception occurred in method execution", ex); } } ``` #### 4. 测试控制器中的应用 在任意 Controller 方法上添加 `@Loggable` 注解即可启用该方法的日志记录功能。 ```java @RestController @RequestMapping("/api/example") public class ExampleController { @GetMapping("/test") @Loggable public String testLogging() { return "This is a logged response."; } } ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值