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. 2021年春季学期-信号与系统-第七次作业参考答案-第八小题
  2. 定制linux版本,Instalinux:在线自由定制 Linux 发行版
  3. 如何在Marketing Cloud的弹出UI窗口里添加扩展字段
  4. 勾股定理的形象拆分法,原来数学可以这么好玩!
  5. Linux内核的Makefile和kconfig解读
  6. linux修改容器内的mysql端口_Linux系统下修改phpstudy集成环境中的MySQL端口号的步骤...
  7. MyCat分布式数据库集群架构工作笔记0012---高可用_Mycat双主双从复制原理
  8. JSP javaweb餐厅点餐系统源码(点餐系统)jsp点餐系统网上订餐
  9. python如何手动编写开根号的算法_手动开根号方法
  10. python 实现实时语音对讲
  11. 搞独立运动,万人如海一身藏
  12. OpenCV API使用笔记 —— 4. 如何保存视频文件
  13. linux /dev/dsp: 没有那个文件或目录 解决方法
  14. 图像处理(九)-图片和数组的转换
  15. 第 4-2 课:开发一个 Flutter TV 应用
  16. 服务器智能管理,管好十万台服务器?必须靠智能!
  17. 区别 a.size()和sizeof(a)
  18. 江苏省10大IT培训机构排行榜
  19. CORBA是什么?用途是什么?
  20. 知更鸟菜单导航如何添加自定义个性图标?

热门文章

  1. Hadoop1000条笔记总汇
  2. vue项目打包后放服务器非根目录下图片找不到
  3. 如何看待23岁博士毕业的科研人,都争着去当网红了?
  4. Virtual Machine Software Architecture Style(虚拟机风格)
  5. bit、sbit、sfr和sfr16的概念和区别
  6. CGCS2000坐标系和WGS84坐标系的区别与联系
  7. 文本挖掘技术——引言
  8. 最近发现一个文字素材网站
  9. 如何挖掘项目中的亮点(多方向带案例)
  10. 微软库 Detour