1、依赖和配置

springboot项目中需要引入相关依赖:

数据库连接配置:

2、service接口及实现类

MongoTemplate是数据库和代码之间的接口,对数据库的操作都在它里面,MongoTemplate是线程安全的。

注:此处只写了一个创建方法,其他查询、删除等方法请自行脑补.

SysLogService.java接口:

SysLogServiceImpl.java实现类:

SysLog.java实体类:

3、开始切面编程

要想把一个类变成切面类,需要两步, 
① 在类上使用 @Component 注解 把切面类加入到IOC容器中 
② 在类上使用 @Aspect 注解 使之成为切面类

用@Aspect注解方式来实现前置通知、返回通知、后置通知、异常通知等

用@Pointcut 来声明切入点表达式

实例代码:

本例实现了拦截接口登录及权限验证、请求记录存到log文件、操作日志(增删改查)存到mongodb、异常日志存到mongodb。

@Aspect
@Component
public class WebLogAspect {

private final Logger logger = LoggerFactory.getLogger(WebLogAspect.class);

@RpcConsumer
    SysLogService sysLogService;

@Autowired
    RedisOperator redis;

@Pointcut("execution(* com.yankuang.*..*Controller.*(..)) && !execution(* com.yankuang.*..*.login*(..))")
    public void login() {
    }

@Pointcut("execution(* com.yankuang.*..*Controller.*(..))")
    public void webLog() {
    }

@Pointcut("execution( * com.yankuang.*..*Controller.*(..)) && !execution(* com.yankuang.*..*.create*(..)) && !execution(* com.yankuang.*..*.update*(..)) " +
            "&& !execution(* com.yankuang.*..*.delete*(..)) && !execution(* com.yankuang.*..*.find*(..))")
    public void sysLog() {
    }

/**
     * 添加业务逻辑方法切入点
     */
    @Pointcut("execution(* com.yankuang.*..*.create*(..)) ")
    public void insertCell() {
    }

/**
     * 修改业务逻辑方法切入点
     */
    @Pointcut("execution(* com.yankuang.*..*.update*(..)) ")
    public void updateCell() {
    }

/**
     * 删除业务逻辑方法切入点
     */
    @Pointcut("execution(* com.yankuang.*..*.delete*(..)) ")
    public void deleteCell() {
    }

/**
     * 查询业务逻辑方法切入点
     */
    @Pointcut("execution(* com.yankuang.*..*.find*(..)) ")
    public void findCell() {
    }

/**
     * 拦截异常处理
     */
    @Pointcut("execution(* com.yankuang.*..controller.*Controller(..))") //切点
    public void webExceptionLog() {
    }

@Before("webLog()")
    public void doBefore(JoinPoint joinPoint) throws Throwable {
        // 接收到请求,记录请求内容
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();

// 记录下请求内容
        logger.info("访问地址 : " + request.getRequestURL().toString());// 访问地址
        logger.info("请求方式 : " + request.getMethod());// 请求方式
        logger.info("访问IP : " + InetAddress.getLocalHost().toString().substring(InetAddress.getLocalHost().toString().lastIndexOf("/") + 1));
        logger.info("执行了" + joinPoint.getTarget().getClass().getName() + "类的" + joinPoint.getSignature().getName() + "方法");// 获取哪个类哪个方法
        logger.info("传入参数 : " + Arrays.toString(joinPoint.getArgs()));//获取传入目标方法的参数对象
        logger.info("请求token : " + request.getHeader("token"));// 请求token
    }

/**
     * 除增删改查(add,delete,update,find)之外的操作日志(后置通知)
     *
     * @param joinPoint
     * @param object
     */
    @AfterReturning(returning = "object", pointcut = "sysLog()")
    public void sysLog(JoinPoint joinPoint, Object object) throws Throwable {
        // 判断参数
        if (joinPoint.getArgs() == null) {// 没有参数
            return;
        }
        SysLog syslog = new SysLog();
        syslog.setContent(opContent(joinPoint));
        syslog.setIpAddress(InetAddress.getLocalHost().toString().substring(InetAddress.getLocalHost().toString().lastIndexOf("/") + 1));
        syslog.setReturnedContent("返回内容为:" + object);
        sysLogService.create(syslog);
    }

/**
     * 添加操作日志(后置通知)
     *
     * @param joinPoint
     * @param object
     */
    @AfterReturning(returning = "object", pointcut = "insertCell()")
    public void insertLog(JoinPoint joinPoint, Object object) throws Throwable {
        // 判断参数
        if (joinPoint.getArgs() == null) {// 没有参数
            return;
        }
        SysLog syslog = new SysLog();
        syslog.setContent(opContent(joinPoint));
        syslog.setOperation("添加");
        syslog.setIpAddress(InetAddress.getLocalHost().toString().substring(InetAddress.getLocalHost().toString().lastIndexOf("/") + 1));
        syslog.setReturnedContent("返回内容为:" + object);
        sysLogService.create(syslog);
    }

/**
     * 管理员删除操作日志(后置通知)
     *
     * @param joinPoint
     * @param object
     * @throws Throwable
     */
    @AfterReturning(value = "deleteCell()", returning = "object")
    public void deleteLog(JoinPoint joinPoint, Object object) throws Throwable {
        // 判断参数
        if (joinPoint.getArgs() == null) {// 没有参数
            return;
        }
        // 创建日志对象
        SysLog syslog = new SysLog();
        syslog.setContent(opContent(joinPoint));
        syslog.setOperation("删除");
        syslog.setIpAddress(InetAddress.getLocalHost().toString().substring(InetAddress.getLocalHost().toString().lastIndexOf("/") + 1));
        syslog.setReturnedContent("返回内容为:" + object);
        sysLogService.create(syslog);
    }

/**
     * 管理员修改操作日志(后置通知)
     *
     * @param joinPoint
     * @param object
     * @throws Throwable
     */
    @AfterReturning(value = "updateCell()", returning = "object")
    public void updateLog(JoinPoint joinPoint, Object object) throws Throwable {
        // 判断参数
        if (joinPoint.getArgs() == null) {// 没有参数
            return;
        }
        // 创建日志对象
        SysLog syslog = new SysLog();
        syslog.setContent(opContent(joinPoint));
        syslog.setOperation("修改");
        syslog.setIpAddress(InetAddress.getLocalHost().toString().substring(InetAddress.getLocalHost().toString().lastIndexOf("/") + 1));
        syslog.setReturnedContent("返回内容为:" + object);
        sysLogService.create(syslog);
    }

/**
     * 管理员查找操作日志(后置通知)
     *
     * @param joinPoint
     * @param object
     * @throws Throwable
     */
    @AfterReturning(value = "findCell()", returning = "object")
    public void findLog(JoinPoint joinPoint, Object object) throws Throwable {
        // 判断参数
        if (joinPoint.getArgs() == null) {// 没有参数
            return;
        }
        // 创建日志对象
        SysLog syslog = new SysLog();
        syslog.setContent(opContent(joinPoint));
        syslog.setOperation("查询");
        syslog.setIpAddress(InetAddress.getLocalHost().toString().substring(InetAddress.getLocalHost().toString().lastIndexOf("/") + 1));
        syslog.setReturnedContent("返回内容为:" + object);
        sysLogService.create(syslog);
    }

/**
     * 异常通知 用于拦截异常日志
     *
     * @param joinPoint
     * @param e
     */
    @AfterThrowing(pointcut = "webExceptionLog()", throwing = "e")
    public void doAfterThrowing(JoinPoint joinPoint, Throwable e) {
        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
        //获取用户请求方法的参数并序列化为JSON格式字符串
        try {
            // 创建日志对象
            SysLog syslog = new SysLog();
            syslog.setContent(opContent(joinPoint));
            syslog.setIpAddress(InetAddress.getLocalHost().toString().substring(InetAddress.getLocalHost().toString().lastIndexOf("/") + 1));
            syslog.setExceptionName(e.getClass().getName());
            syslog.setExceptionMsg(e.getMessage());
            //保存数据库
            sysLogService.create(syslog);
        } catch (Exception ex) {
            //记录本地异常日志
            e.printStackTrace();
        }
    }

/**
     * 获取执行的操作的信息
     *
     * @param joinPoint
     * @return
     */
    public String opContent(JoinPoint joinPoint) {
        //获取类名
        String className = joinPoint.getTarget().getClass().getName();
        //获取方法名
        String methodName = joinPoint.getSignature().getName();
        String str = "执行了" + className + "类的" + methodName + "方法";
        return str;
    }

/**
     * 接口拦截验证
     *
     * @param joinPoint
     * @throws Throwable
     */
    @Around("login()")  // CommonResponse
    public Object loginVerify(ProceedingJoinPoint joinPoint) throws Throwable {
        HttpServletRequest request =
                ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();

String token = request.getHeader("token");
        if (StringUtils.isEmpty(token)) {
            return CommonResponse.errorTokenMsg("token不能为空,请登录");
        }
        String authorityCode = request.getHeader("authorityCode");
        if (StringUtils.isEmpty(authorityCode)) {
            return CommonResponse.errorTokenMsg("authorityCode不能为空");
        }
        String userRedis = (String) redis.get(token);
        if (StringUtils.isEmpty(userRedis)) {
            return CommonResponse.errorTokenMsg("登陆超时,请重新登录!");
        }
        // 刷新token时长
        redis.expire(token, 7200);
        // json转对象  todo
        //UserDTO userFromRedis = JsonUtils.jsonToPojo(userRedis, UserDTO.class);
        //  根据authorityCode鉴权 todo

// 登录跟验证权限通过,接受相应方法返回值(可做相应处理),返回前端 todo
        //CommonResponse result = (CommonResponse) joinPoint.proceed();

return joinPoint.proceed();
    }
}

MongoDB-与SpringBoot整合及日志记录相关推荐

  1. Springboot整合log4j2日志全解

    作者:上帝爱吃苹果 cnblogs.com/keeya/p/10101547.html 在项目推进中,如果说第一件事是搭Spring框架的话,那么第二件事情就是在Sring基础上搭建日志框架,我想很多 ...

  2. 【ReactJs+springBoot项目——租房】第6章:MongoDB入门+SpringBoot整合MongoDB+搭建微聊系统+实现微聊功能

    MongoDB入门 MongoDB的java api的使用 SpringBoot整合MongoDB使用 搭建微聊系统 实现微聊功能 分布式WebSocket解决方案分析 1.MongoDB入门 1.1 ...

  3. SpringBoot整合Logback日志框架+Slf4j注解使用

    文章目录 1.基本介绍 2.使用说明 2.1 引入maven依赖 2.2 创建logback-spring.xml 3.编写一个HTTP接口 3.1 通过创建LoggerFactory实例 3.2 通 ...

  4. 第十一节:Springboot整合log4j2日志

    SpringBoot默认使用的是logback, 但是还有一个性能更高的日志实现框架log4j2. 为什么选用log4j2 相比与其他的日志系统,log4j2丢数据这种情况少:disruptor技术, ...

  5. SpringBoot的统一日志记录

    利用Aop拦截所有的Service方法,对执行结果日志进行记录. package com.ats.dt.advice; import com.ats.dt.exceptions.HandleExcep ...

  6. SpringBoot整合lombok日志

    1.配置依赖 2.设置日志配置文件路径 3.创建日志配置文件 4.编写Service和ServiceImpl并运行查看效果 1.配置依赖 pom.xml <dependency><g ...

  7. 第十六章:springboot 整合logback日志

    2019独角兽企业重金招聘Python工程师标准>>> Logback介绍:   Logback是由log4j创始人设计的另一个开源日志组件,官方网站: http://logback ...

  8. SpringBoot整合ELK日志收集

    ELK简介 ELK是Elasticsearch+Logstash+Kibana简称 Elasticsearch 是一个分布式的搜索和分析引擎,可以用于全文检索.结构化检索和分析,并能将这三者结合起来. ...

  9. springboot整合log4j日志框架

    在创建Spring Boot工程时,我们引入了spring-boot-starter,其中包含了spring-boot-starter-logging,该依赖内容就是Spring Boot默认的日志框 ...

最新文章

  1. 2019微生物组—宏基因组分析技术研讨会第五期
  2. 第 3 章 MySQL 存储引擎简介
  3. 我学员的一个问题及其我对之的解答,关于lr返回值问题
  4. 个人作业——软件工程实践总结
  5. 编程之美 2.14求数组的子数组之和的最大值
  6. ConcurrentHashMap的源码分析-fullAddCount源码分析
  7. jsp内置对象--session
  8. PHP实现单件模式的几种方式
  9. mybatis与hibernate的区别及各自应用场景
  10. 2018最新qq的服务器地址,腾讯QQ2018正式版新功能详细介绍
  11. 计算机设备没有音频,计算机上没有音频设备是什么意思?
  12. 常见物联网通信技术概览(全集)
  13. 【科研绘图】沐风老师3DMAX极小曲面建模教程
  14. win10系统迁移后系统重装_Windows10系统迁移后无法更新
  15. 从CentOS官网下载系统镜像
  16. 安装油猴(Tampermonkey)插件,让你的浏览器更强大
  17. 使用xlwt将数据保存到excel文件中,python
  18. 招聘信息薪资范围是12-20K,能否要20K的薪资?
  19. 如何在opensolaris2008.05清除root密码
  20. mysql数据库的行级锁有几种_数据库行级锁和表锁区别

热门文章

  1. 2015年2月25日
  2. 伽马分布,指数分布,泊松分布的关系 -转自简书
  3. java中异常处理中的异常匹配
  4. 持续交付(CD)与持续集成(CI)
  5. redis+mysql
  6. python办公自动化--案例练习
  7. 万剑归宗(二 变量和基本类型)
  8. Fixed There was a problem with the editor 'vi'
  9. 10.13—广搜 //特殊的二阶魔方//推箱子//polygon//木乃伊迷宫
  10. R语言中哑变量的设置