后台管理系统日志管理模块的实现

news2024/10/6 6:38:34

一、日志管理系统

1.1目标效果图

 1.2创建日志表,和对应的实体类

@Data
public class SysLog implements Serializable {
    private static final long serialVersionUID = 1123526L;
    private Integer id;
    private String module;
    private String content;
    private Integer createId;
    private Timestamp createTime;

    private String uname;
}

1.3controller

@RestController
@RequestMapping("syslog")
public class SysLogController {
    @Autowired
    private SysLogService sysLogService;

    @GetMapping("findAll")
    public Result findAll() {
        return Result.success(sysLogService.findAll());
    }
}

1.4service

public interface SysLogService {
    List<SysLog> findAll();
}
@Service
public class SysLogServiceImpl implements SysLogService {
    @Autowired
    private SysLogMapper sysLogMapper;

    @Override
    public List<SysLog> findAll() {
        return sysLogMapper.findAll();
    }
}

1.5mapper

public interface SysLogMapper extends BaseMapper<SysLog> {
    List<SysLog> findAll();
    @Override
    @Insert("insert into sys_log values (null, #{module}, #{content}, #{createId}, now())")
    boolean insert(SysLog sysLog);

}

注意:因为要返回给前端创建人的姓名,所以连表查询了,将name一块返回了 

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.itqq.mapper.SysLogMapper">
    <select id="findAll" resultType="SysLog">
        SELECT s.*, u.username AS uname FROM sys_log s
        left JOIN `user` u ON s.create_id = u.id
    </select>
</mapper>

1.6核心代码配置Aop切面,监控所有带注解的接口方法

1.6.1注解类LogAnnotation的配置
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface LogAnnotation {
    String module() default "";
    String content() default "";
}

通过注解获取操作模块和操作内容

比如:student模块

 @LogAnnotation(module = "学生模块",content = "查询所有学生")
    @GetMapping("findAll")
    public Result findAll(){
        return Result.success(studentService.findAll());
    }

    @GetMapping("fidById/{id}")
    @LogAnnotation(module = "学生模块",content = "查询id学生")
    public Result fidById(@PathVariable int id){
        return Result.success(studentService.findById(id));
    }

    @PostMapping("add")
    @LogAnnotation(module = "学生模块",content = "添加学生")
    public Result add(@RequestBody Student student){
        studentService.add(student);
        return Result.success(student);
    }
1.6.2重要**通过Spring Aop和自定义注解@LogAnnotation,来监控和记录方法调用
package com.itqq.config;

import com.itqq.mapper.SysLogMapper;
import com.itqq.pojo.SysLog;
import com.itqq.utils.LogAnnotation;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Method;

/**
 * Created with IntelliJ IDEA.
 *
 * @Author: syq
 * @Date: 2024/07/04
 * @Description:
 */
@Component
@Aspect
@Slf4j
public class SysLogAop {

    @Autowired
    private SysLogMapper sysLogMapper;
    @Autowired
    private HttpServletRequest request;

//    切面com.itqq.utils.LogAnnotation根据这个类进行切
    @Around("@annotation(com.itqq.utils.LogAnnotation)")
    public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
//        将程序执行的某个点(调用方法等) 返回的值保存在result中
        Object result = joinPoint.proceed();
//        获取joinPoint的签名--即描述了方法的信息,如方法名、参数类型等
//       由于签名可能有多种类型,但在这里我们关心的是方法签名,所以将其转换为MethodSignature类型
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
//        从MethodSignature对象中获取实际的Method对象,这将提供对方法的完整反射访问,包括其注解和参数。
        Method method = signature.getMethod();
//      利用反射机制从Method对象中获取@LogAnnotation注解的实例
//      如果方法上没有这个注解,则返回null。
        LogAnnotation logAnnotation = method.getAnnotation(LogAnnotation.class);
        log.info("{}",logAnnotation);

//      创建一个SysLog对象实例,用于封装系统日志的相关信息。
        SysLog sysLog = new SysLog();
//      从@LogAnnotation注解中提取module和content属性的值,并分别设置为SysLog对象的module和content字段。
        sysLog.setModule(logAnnotation.module());
        sysLog.setContent(logAnnotation.content());
        // 获取用户id---从TokenInterceptor拦截器传来的userId
        Integer userId = (Integer) request.getAttribute("userId");
        sysLog.setCreateId(userId);
        sysLogMapper.insert(sysLog);

        return result;
    }

}

通过这种方式,每当带有@LogAnnotation的方法被调用时,Spring AOP都会自动执行SysLogAop中的around()方法,从而记录下方法的操作模块和操作内容,实现对方法操作的间接监控和日志记录。这种方法不仅减少了代码侵入性,也使得日志功能更加模块化和易于管理。

1.7展望

除了AOP之外,日志系统还可以通过过滤器(Filters)和拦截器(Interceptors)来实现,这两种机制在Web应用中尤其常见,它们各自有独特的应用场景和优势:

过滤器(Filters)

过滤器是Servlet规范的一部分,它们在请求到达目标资源(如Servlet、JSP页面或其他过滤器)之前执行,也可以在响应返回客户端之前执行。因此,过滤器非常适合用于全局性的请求处理,如日志记录、安全性检查、编码转换等。

如何使用过滤器实现日志记录:
  1. 创建过滤器类:实现javax.servlet.Filter接口或继承javax.servlet.GenericFilter抽象类,覆盖init(), doFilter(), 和 destroy() 方法。在doFilter()方法中,可以记录请求的细节,如请求URI、请求方法、请求时间等。

  2. 配置过滤器:在web.xml配置文件中,声明过滤器并通过<filter-mapping>元素将其映射到需要拦截的URL模式上,或者在Java配置类中使用DelegatingFilterProxy进行配置。

拦截器(Interceptors)

拦截器是Spring MVC框架提供的特性,主要用于处理MVC架构中的请求。它们在控制器方法执行之前和之后执行,可以用于执行预处理(如认证、授权)、后处理(如关闭资源、记录日志)等任务。

如何使用拦截器实现日志记录:
  1. 创建拦截器类:实现org.springframework.web.servlet.handler.HandlerInterceptor接口,覆盖preHandle(), postHandle(), 和 afterCompletion() 方法。在preHandle()方法中可以记录请求开始的信息,在afterCompletion()方法中记录请求完成的信息。

  2. 配置拦截器:在Spring MVC的配置类中,通过实现WebMvcConfigurer接口的addInterceptors()方法,注册拦截器并配置其拦截的URL模式。

比较与选择

  • 全局性:过滤器适用于所有Servlet请求,无论请求的目标是哪个具体的Servlet或JSP页面,而拦截器只作用于Spring MVC的控制器请求。

  • 灵活性:拦截器提供了更多的控制点(preHandle, postHandle, afterCompletion),可以更细致地控制请求的处理流程,而过滤器主要在请求的开始和结束时执行。

  • 集成性:拦截器紧密集成在Spring MVC框架内,可以方便地访问Spring IoC容器中的bean,而过滤器相对独立,获取Spring bean需要额外的配置。

选择过滤器还是拦截器实现日志系统,主要取决于具体的应用场景和需求。如果你的应用基于Spring MVC,且日志记录需要与框架的其他特性紧密结合,那么拦截器可能是更好的选择。反之,如果你希望实现一个更通用的日志系统,不依赖于特定的框架,或者需要处理非Spring MVC的请求,过滤器则更为合适。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1895644.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android C++系列:JNI中的Handler--ALooper

1. Android Handler回顾 在Android中,UI线程是一个很重要的概念。我们在日常开发中对UI的更新和一些系统行为,都必须在UI线程(主线程)中进行调用。我们在子线程更新UI时最常用的手段就是Handler,Handler的主要原理: 主要是有一个Looper不停的从队列读消息,子线程通过持有…

Redis-Redis可视化工具Redis Insight下载及安装

下载 1、博主已经上传资源&#xff0c;点此下载 2、点此进入官方下载 2.1 点击Installing Redis Insight 2.2 点击Install on desktop 2.3 选择Install on desktop&#xff0c;点击Redis Insight is available for download for free from this web site从网站下载 2.4 下载…

Anaconda+Pycharm两个软件从头到尾下载流程

前言&#xff1a; 1、使用教程前&#xff0c;请将电脑上的所有的Python卸载掉。再下载Anaconda&#xff0c;Anaconda这个软件里面就含有python。 彻底删除python方法&#xff1a; 1、计算机——属性——高级系统设置——环境变量 2、查看电脑用户自己设计的环境变量&#x…

FileZilla的安装和使用(快速上手版)

下载 登陆官网下载下载 - FileZilla中文网 服务端 我们选择一个中文安装最新版本下载 客户端 我们选择绿色免安装版进行下载 安装 安装服务端 双击运行下载好的服务端安装包 点击 我接受 点击 下一步 设置好安装路径&#xff0c;点击 下一步 这里默认即可&#xff0c;点击…

昇思25天学习打卡营第16天|文本解码原理——以MindNLP为例

在大模型中&#xff0c;文本解码通常是指在自然语言处理&#xff08;NLP&#xff09;任务中使用的大型神经网络模型&#xff08;如Transformer架构的模型&#xff09;将编码后的文本数据转换回可读的原始文本的过程。这些模型在处理自然语言时&#xff0c;首先将输入文本&#…

Understanding Zero Knowledge Proofs (ZKP)

Bilingual Tutorial: Understanding Zero Knowledge Proofs (ZKP) 双语教程&#xff1a;理解零知识证明&#xff08;ZKP&#xff09; Introduction 介绍 English: Zero Knowledge Proofs (ZKP) are a fascinating concept in cryptography where one party (the prover) can…

java项目自定义打印日志,打印请求方式,参数用时等

1.相关依赖 <!-- 私人工具包 --><dependency><groupId>cn.changeforyou</groupId><artifactId>location</artifactId><version>1.13-SNAPSHOT</version></dependency><!-- hutool工具依赖 --><dependency>…

六大Pixel新AI功能提升使用体验

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

探索如何赋予对象迭代魔法,轻松实现非传统解构赋值的艺术

前言 今天下午在网上冲浪过程中看到这样一个问题 面试题&#xff1a;如何让 var [a, b] {a: 1, b: 2} 解构赋值成功&#xff1f; 据说是某大厂面试题&#xff0c;于是我学习了一下这个问题&#xff0c;写下这篇文章记录一下。 学习过程 要想解决这个问题首先要知道什么是解…

nginx安装升级修复HTTP头信息泄露Nginx版本信息漏洞(并保持https配置)

文章目录 1. 准备工作2. 修改web服务器所使用的nginx的名称和版本信息2.1 修改以下三个文件&#xff1a;(1) src/core目录下的nginx.h文件(2) src/http目录下的ngx_http_header_filter_module.c文件(3) src/http目录下的ngx_http_special_response.c文件 2.2 重新编译nginx2.3 …

Spring框架的学习前言

1.注意事项 1.在接下来的学习中我们会将jdk的版本升级到17。 2.引入maven仓库用来存储依赖 3.在后面的javaSpring框架中要第一个项目的创建要选javaweb和lombook这两个依赖 2.Maven的主要功能 &#xff08;1&#xff09;maven的主要功能是引入依赖和管理依赖&#xff0c;在…

第7章:Electron文件系统操作(2)

7.2 文件对话框 Electron 提供了 dialog 模块用于显示文件打开和保存对话框。 7.2.1 显示文件打开对话框 主进程代码&#xff1a; const { app, BrowserWindow, ipcMain, dialog } require(electron); const path require(path);let mainWindow;const createMainWindow …

【Ubuntu】详细说说Parallels DeskTop安装和使用Ubuntu系统

希望文章能给到你启发和灵感~ 如果觉得文章对你有帮助的话,点赞 + 关注+ 收藏 支持一下博主吧~ 阅读指南 开篇说明一、基础环境说明1.1 硬件环境1.2 软件环境二、Ubuntu系统的使用2.1 系统的下载2.2 系统的安装2.3 安装桌面版(可选)2.3.1 安装/更新apt2.3.2 安装桌面版2.3…

4.通过制作trackbar控件了解3原色在opencv的应用-cnblog

通过制作trackbar控件了解3原色在opencv的应用 什么是3原色 一张彩色图片通常是由三种基本颜色&#xff0c;即红色、绿色和蓝色&#xff08;通常称为RGB&#xff09;的混合组成的。这三种颜色以不同的比例混合可以产生几乎所有其他颜色。在数字图像中&#xff0c;每个像素通常…

找不到msvcr110.dll是怎么回事?彻底解决msvcr110.dll丢失的方法

当您的电脑提示遇到msvcr110.dll丢失时&#xff0c;您知道如何解决此问题吗&#xff1f;事实上&#xff0c;解决此类dll文件丢失的问题相对较为简单。只要我们深入了解msvcr110.dll丢失的具体情况&#xff0c;便可轻松解决此问题。以下为您介绍msvcr110.dll修复方法。 一&#…

算法库应用-顺序串(串比较)

学习贺利坚老师博客 数据结构例程——串的顺序存储应用_使用顺序串存储身份证号-CSDN博客 本人详细解析博客 串的顺序存储结构应用_(1)假设串采用顺序串存储,设计一个算法程序,按顺序比较两个串s和t的大小。请-CSDN博客 版本日志 V1.0: 利用顺序串, 进行简单的判断比较, 也算是…

某DingTalk企典 - Token

⚠️前言⚠️ 本文仅用于学术交流。 学习探讨逆向知识&#xff0c;欢迎私信共享学习心得。 如有侵权&#xff0c;联系博主删除。 请勿商用&#xff0c;否则后果自负。 网址 aHR0cHM6Ly9kaW5ndGFsay5jb20vcWlkaWFuLw 浅聊一下 没毛病&#xff0c;就这字段&#xff0c;有效期…

【前端CSS3】CSS显示模式(黑马程序员)

文章目录 一、前言&#x1f680;&#x1f680;&#x1f680;二、CSS元素显示模式&#xff1a;☀️☀️☀️2.1 什么是元素显示模式2.2 块元素2.3 行内元素2.4 行块元素2.5 元素显示模式的转换 三、总结&#x1f680;&#x1f680;&#x1f680; 一、前言&#x1f680;&#x1f…

小程序 npm 支持

使用 npm 包 目前小程序已经支持使用 npm 安装第三方包&#xff0c;因为 node_modules 目录中的包不会参与小程序项目的编译、 上传和打包&#xff0c;因此在小程序 项目中要使用的 npm 包&#xff0c;必须走一遍构建 npm 的过程。在构建成功以后&#xff0c;默认 会在小程序目…