SpringBoot使用SpringAOP实现日志审计等功能

项目当中需要对用户操作菜单的行为记录日志,用SpringAOP写了个大概实现,切点是采用注解的方式,用包名的方式虽然也可以达到相同的效果,但是不如注解方式灵活方便。

不多说,直接上代码,此处只是简单写写实现原理。

工程目录:

pom.xml引入以下依赖:

<!-- 热部署模块 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
    <scope>runtime</scope>
    <optional>true</optional> <!-- 这个需要为 true 热部署才有效 -->
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

<!-- spring-boot aop依赖配置引入 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

注解:

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface Action {
    String description() default "no description";
}

Controller类:

/**
 * @auther: gaopeng
 */
@RestController
public class AspectController {

    /**
     * 走切面
     * @return
     */
    @GetMapping("/test")
    @Action(description = "执行了test操作菜单")
    public String test(){
        return "method return";
    }

    /**
     * 不走切面
     */
    @GetMapping("/test1")
    private void test1(){
    }

    /**
     * 走切面,抛异常
     */
    @GetMapping("/throws")
    @Action(description = "执行了throws菜单但是抛了异常")
    public void throwsException(){
        throw new RuntimeException();
    }
}

切面类:

/**
 * @auther: gaopeng
 */
@Aspect
@Component
public class TestAspect {

    /**
     * 切入点
     */
    // 此处的切点是注解的方式,也可以用包名的方式达到相同的效果
    //@Pointcut("execution(public * com.gaopeng.springboot.mytest.controller.*.*(..))")
    @Pointcut("@annotation(com.gaopeng.springboot.mytest.annotation.Action)")
    public void execute(){
    }

    /**
     * 前置通知
     * @param joinPoint
     */
    @Before(value ="execute()")
    public void Before(JoinPoint joinPoint) {
        System.out.println("执行方法之前");
    }

    /**
     * 环绕通知
     * @param proceedingJoinPoint
     * @return
     */
    @Around(value ="execute()")
    public Object around(ProceedingJoinPoint proceedingJoinPoint) {
        System.out.println("环绕通知开始");
        try {
            System.out.println("执行方法:" + proceedingJoinPoint.getSignature().getName());

            MethodSignature signature =(MethodSignature) proceedingJoinPoint.getSignature();
            Action action = signature.getMethod().getAnnotation(Action.class);

            System.out.println("菜单="+action.description());

            Object object =  proceedingJoinPoint.proceed();
            System.out.println("环绕通知结束,方法返回:" + object);
            return object;
        } catch (Throwable e) {
            System.out.println("执行方法异常:" + e.getClass().getName());
            return null;
        }
    }

    /**
     * 后置通知
     * @param joinPoint
     */
    @After(value ="execute()")
    public void After(JoinPoint joinPoint) {
        System.out.println("执行方法之后");
    }

    /**
     * 后置通知,带返回值
     * @param obj
     */
    @AfterReturning(pointcut = "execute()",returning = "obj")
    public void AfterReturning(Object obj) {
        System.out.println("执行方法之后获取返回值:"+obj);
    }

    /**
     * 后置通知,异常时执行
     * @param e
     */
    @AfterThrowing(throwing = "e",pointcut = "execute()")
    public void doAfterThrowing(Exception e) {
        System.out.println("执行方法异常:"+e.getClass().getName());
    }
}

运行结果:

原文地址:https://www.cnblogs.com/gaopengpy/p/11897917.html

时间: 2024-10-09 21:17:08

SpringBoot使用SpringAOP实现日志审计等功能的相关文章

在SpringBoot中用SpringAOP实现日志记录功能

背景: 我需要在一个SpringBoot的项目中的每个controller加入一个日志记录,记录关于请求的一些信息. 代码类似于: logger.info(request.getRequestUrl()); 之类的. 代码不难,但由于Controller的数量不少,干起来也是体力活.所以想到了用Spring AOP来解决这个问题. 首先,在pom中加入SpringAOP的相关依赖: <dependency> <groupId>org.springframework.boot<

Linux 6.8 sudo 日志审计

公司内Linux服务器启用了SUDO权限管理,但还是有一定的风险,所以为了便于管理和后续维护,开启sudo日志审计的功能,对用户执行的sudo命令的操作行为进行记录,但又不记录其他的命令. 一.rsyslog 全部操作日志审计,信息量大,不方便以后查阅,我们选择只对sudo进行日志审计. 二.使用rpm -qa 查询是否安装服务,若没有就使用yum install XXXX -y 安装服务 [[email protected] ~]# rpm -qa |grep sudo sudo-1.8.6p

模拟sudo+rsyslog日志审计功能

生产环境日志审计解决方案 所谓日志审计,就是记录所有系统及相关用户行为的信息,并且可以自动分析.处理.展示(包括文本或者录像) 1) 通过环境变量命令及syslog服务进行全部日志审计(信息太大,不推荐) 2) Sudo配合syslog服务,进行日志审计(信息较少,效果不错) 3) 在bash解释器程序里嵌入一个监控器,让所有被审计的系统用户使用修改过的增加了监视器的特殊bash程序作为解释程序 4) 齐治的堡垒机:商业产品 Sudo日志审计:专门对使用sudo命令的系统用户记录其执行的命令相关

MySQL日志审计 帮你揪出内个干坏事儿的小子

MySQL日志审计 帮你揪出内个干坏事的小子 简介 Part1:写在最前 MySQL本身并不像MariaDB和Percona一样提供审计功能,但如果我们想对数据库进行审计,去看是谁把我的数据库数据给删了,该怎么办呢?我们主要利用init-connect参数,让每个登录的用户都记录到我们的数据库中,并抓取其connection_id(),再根据binlog就能够找出谁干了那些破事儿. MariaDB如何审计,可移步: http://suifu.blog.51cto.com/9167728/1857

日志审计策略配置audit

日志审计策略配置 1.   系统缺省已经开启syslog/rsyslog服务,禁止关闭.系统syslog/rsyslog服务会将所有系统日志自动记录到/var/log/messages文件中,系统日志永久保留. 2.   开启audit审计功能,可以监控指定用户或目录,缺省会监控root的所有登录和操作. l  添加规则到 /etc/audit/audit.rules(RHEL7为/etc/audit/rules.d/audit.rules) 文件中,实现监控所有用户的登录行为,包含用户所有操作

Web安全开发指南--异常错误处理与日志审计

1.异常错误处理与日志审计 5.1.日志审计系统安全规则 1 日志系统能够记录特定事件的执行结果(比如 成功或失败). 确保日志系统包含如下重要日志信息: 1.  日志发生的时间: 2.  事件的严重等级: 3.  能够标识该事件为安全事件的标签: 4.  导致事件产生的对象: 5.  导致事件产生的IP地址: 6.  事件的结果(成功或失败): 7.  关于事件的描述. 2 如果使用浏览器查看日志,确保先对日志数据进行净化.(item1.2请参考附录11.8) 3 不要在日志中存储任何敏感数据

为什么需要日志审计系统

什么是日志 简单地说,日志就是计算机系统.设备.软件等在某种情况下记录的信息.具体的内容取决于日志的来源.例如,Unix操作系统会记录用户登录和注销的消息,防火墙将记录ACL通过和拒绝的消息,磁盘存储系统在故障发生或者在某些系统认为将会发生故障的情况下生成日志信息.日志中有大量信息,这些信息告诉你为什么需要生成日志,系统已经发生了什么.例如,Web服务器一般会在有人访问Web页面请求资源(图片.文件等等)的时候记录日志.如果用户访问的页面需要通过认证,日志消息将会包含用户名.这就是日志数据的一个

SpringBoot初始教程之日志处理(二)

SpringBoot初始教程之日志处理(二) 1.介绍 SpringBoot默认是采用logback进行日志处理.Logback是由log4j创始人设计的又一个开源日志组件.Logback是由log4j创始人设计的又一个开源日志组件. logback当前分成三个模块:logback-core,logback- classic和logback-access.logback-core是其它两个模块的基础模块.logback-classic是log4j的一个 改良版本.此外logback-classi

SpringBoot文档翻译系列——26.日志logging

原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/7613854.html 这是SpringBoot的日志内容 26 日志 Spring使用CommonLogging作为内置日志记录工具,但也保留了底层日志的实现.默认的配置提供了Java Util Logging.Log4J2和LogBack.在不同情况下,可以通过预先的配置来选择控制台输出或者文件输出. 默认情况下,如果你使用了SpringBoot的"Starters",将会使