AOP记录操作日志

创建数据库表

-- 操作日志
create table operate_log (
    id int unsigned primary key auto_increment comment'id',
    operate_user int unsigned comment '操作人员Id',
    operate_time datetime comment '操作时间',
    class_name varchar(100)comment '操作类',
    method_name varchar(100)comment '操作的方法',
    method_params varchar(1000)comment '方法参数',
    return_value varchar(2000)comment '返回值',
    cost_time bigint comment '方法执行耗时, 单位:ms'
    ) comment '操作日志表';

引入APO依赖

 <!-- AOP依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>

 

创建数据库对应的类

@Data
@NoArgsConstructor
@AllArgsConstructor
public class OperateLog {
    private Integer id;
    private Integer operateUser;// 操作人员的id
    private LocalDateTime operateTime;//操作时间
    private String className; // 操作类名
    private String methodName ; //操作方法
    private String methodParams; //方法参数
    private String returnValue; //返回值
    private Long costTime; //操作耗时

创建注解类

package com.it.anno;


import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME) //运行的时候
@Target(ElementType.METHOD) //目标是方法
public @interface Log {

}

创建AOP类

package com.it.aop;


import com.alibaba.fastjson.JSONObject;
import com.it.mapper.OperateLogMapper;
import com.it.pojo.OperateLog;
import com.it.utils.JwtUtils;
import io.jsonwebtoken.Claims;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.time.LocalDateTime;
import java.util.Arrays;

@Slf4j
@Component
@Aspect //切面类
public class LogAspect {

    @Autowired
    private HttpServletRequest response;
    @Autowired
    private OperateLogMapper operateLogMapper;


    @Around("@annotation(com.it.anno.Log)")
    public Object recordLog(ProceedingJoinPoint joinPoint) throws Throwable{

        //id 自增
        //操作人的id
       String jwt= response.getHeader("token");
        Claims claims = JwtUtils.parseJWT(jwt);
        Integer operateUser =(Integer) claims.get("id");

        //操作时间
        LocalDateTime operateTime = LocalDateTime.now();

        //操作类名
        String className = joinPoint.proceed().getClass().getName();

        //操作方法名
        String methodName = joinPoint.getSignature().getName();

        //操作方法参数
        Object[] args = joinPoint.getArgs();
        String methodParams = Arrays.toString(args);

        //记录时间 (开始)
        long begin = System.currentTimeMillis();

        //调用原始的目标方法运行
        Object proceed = joinPoint.proceed();
        //记录时间 (结束)
        long end = System.currentTimeMillis();

        //方法返回值
        String returnValue = JSONObject.toJSONString(proceed);

        //耗时时间
        long costTime = end - begin;



        //记录日志
        OperateLog operateLog=new OperateLog(null,operateUser,operateTime,className,methodName,methodParams,returnValue,costTime);
        operateLogMapper.insert(operateLog);
        log.info("AOP记录操作日志:{}",operateLog);
        return proceed;
    }
}

 每个方法上把自定义的@Log注解引入进来

 /*根据ID删除部门*/
    //@DeleteMapping("/{id}")
    @Log
    @DeleteMapping("/depts/{id}")
    public Result delete( @PathVariable Integer id) throws Exception {
        log.info("根据ID删除部门:{}",id);
        deptservec.delete(id);
        return Result.success();

    }
        //新增部门
   // @PostMapping
    @Log
       @PostMapping ("/depts")
    public Result add( @PathVariable Dept dept) {
        log .info("新增部门:{}",dept);
            deptservec.add(dept);
       return  Result.success();
    }

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

IDEA 修改encoding

IDEA 修改encoding 现象&#xff1a;idea展示乱码 打开Settings>>File Encodings&#xff0c;修改为UTF-8即可

Kubernetes(K8s)_17_Kubernetes扩展

Kubernetes&#xff08;K8s&#xff09;_17_Kubernetes扩展 Kubernetes扩展CustomResuorceDefinition自定义API ServerOperator Kubernetes扩展 Kubernetes扩展: 不同角度实现对Kubernetes功能的增加/增强 内部组件: API Server、CRD、Operator、授权和准入控制kubelet: CRI、…

Linux环境变量与命令行参数

Linux环境变量与命令行参数 一.命令行参数1.语法2.应用1:简易计算器 二.环境变量1.环境变量的概念2.环境变量的作用3.进一步理解环境变量的作用4.常见环境变量5.导出环境变量(添加环境变量)6.环境变量的特性7.另一种获取环境变量的方式8.小功能:用于身份验证的代码9.补充:第三种…

Elasticsearch:什么是机器学习?

机器学习定义 机器学习 (ML) 是人工智能 (AI) 的一个分支&#xff0c;专注于使用数据和算法来模仿人类的学习方式&#xff0c;并随着时间的推移逐渐提高准确性。 计算机科学家和人工智能创新者 Arthur Samuel 在 20 世纪 50 年代首次将其定义为 “赋予计算机无需明确编程即可学…

C 语言实现TCP 通信,以及地址复用

服务端 #include <stdio.h> #include <sys/types.h> #include <sys/socket.h> #include <unistd.h> #include <arpa/inet.h>int main() {//监听套接字文件描述符int listenFd -1;//连接套接字的文件描述符int connFd -1;//服务器的地址结构st…

html实现好看的个人博客留言板源码

文章目录 1.设计来源1.1 博客主界面1.2 常用源码1.3 我的文章1.4 留言板1.5 联系我 2.效果和源码2.1 动态效果2.2 源代码 源码下载 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/article/details/134837482 html实现好看的个人博客留言…

(C语言)判定同数异形体

同数异形体&#xff1a;有相同的数字包括数字个数&#xff0c;不同排列形成的正整数。 例如&#xff1a;12334和33214均由1个1,1个2,2个3,1个4组成&#xff0c;故互为同数异形体&#xff0c;而1234和3221就不是。 #include<stdio.h> bool Isomorphism(int num1,int num…

js二维数组实现纵向求和

需求&#xff1a;横向纵向都可以求和&#xff0c;剩余分数为100减去纵向之和 var arr [{id: 张丹,rowInfo: [{ realScore: 12 },{ realScore: 34 },{ realScore: 0 },{ realScore: 0 },{ realScore: 0 },],},{id: 丽丽,rowInfo: [{ realScore: 0 },{ realScore: 0 },{ realSc…

2023年最详细介绍Linux 系统目录结构!你确定不来了解一下吗?

&#x1f4da;&#x1f4da; &#x1f3c5;我是默&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; ​​​ &#x1f31f;在这里&#xff0c;我要推荐给大家我的专栏《Linux》。&#x1f3af;&#x1f3af; &#x1f680;无论你是编程小白&#xff0c;还是有…

Python实现FA萤火虫优化算法优化Catboost回归模型(CatBoostRegressor算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 萤火虫算法&#xff08;Fire-fly algorithm&#xff0c;FA&#xff09;由剑桥大学Yang于2009年提出 , …

一文带你区分Cookie 和 Session

Cookie 和 Session HTTP 协议是一种无状态协议&#xff0c;即每次服务端接收到客户端的请求时&#xff0c;都是一个全新的请求&#xff0c;服务器并不知道客户端的历史请求记录&#xff1b; Session 和 Cookie 的主要目的就是为了弥补 HTTP 的无状态特性 1、Session 是什么 …

IDEA导入JavaWeb项目(Maven)

IDEA导入JavaWeb(Maven)项目教程 运行教程 亲爱的粉丝们&#xff0c;我深知你们对IDEA导入JAVAWeb工程的迫切需求。在这个充满竞争的时代&#xff0c;每一个项目都离不开高效的沟通。过程中需要对应的环境适配和软件安…

openGauss学习笔记-146 openGauss 数据库运维-备份与恢复-配置文件的备份与恢复

文章目录 openGauss学习笔记-146 openGauss 数据库运维-备份与恢复-配置文件的备份与恢复146.1 背景信息146.2 前置条件146.3 操作步骤146.4 示例 openGauss学习笔记-146 openGauss 数据库运维-备份与恢复-配置文件的备份与恢复 146.1 背景信息 在openGauss使用过程中&#x…

class051 二分答案法与相关题目【算法】

class051 二分答案法与相关题目【算法】 算法讲解051【必备】二分答案法与相关题目 code1 875. 爱吃香蕉的珂珂 // 爱吃香蕉的珂珂 // 珂珂喜欢吃香蕉。这里有 n 堆香蕉&#xff0c;第 i 堆中有 piles[i] 根香蕉 // 警卫已经离开了&#xff0c;将在 h 小时后回来。 // 珂珂…

生成对抗网络——研讨会

时隔一年&#xff0c;再跟着李沐大师学习了GAN之后&#xff0c;仍旧没能在离散优化中实现通用的应用&#xff0c;实在惭愧&#xff0c;借着组内研讨会的机会&#xff0c;再队GAN的前世今生做一个简单的综述。 GAN产生的背景 目前与GAN相关的应用 去reddit社区的机器学习板块…

外汇天眼:SEC(美国证券交易委员会)获得对Lupo Securities的最终判决

美国证券交易委员会&#xff08;SEC&#xff09;已获得对Lupo Securities LLC的最终判决。 2023年12月4日&#xff0c;伊利诺伊州北区法院的尊敬的约翰罗伯特布雷基法官签署了有关Lupo Securities的最终判决。 法院命令被告永久受限制和禁止违反《证券交易法》&#xff08;“…

简单地将附件POST到Notes应用中

大家好&#xff0c;才是真的好。 这半年我们会讲很多开发知识&#xff0c;这篇紧接上篇《通过URL将HTML表单数据创建到Domino应用中》&#xff0c;讲述如何将附件POST到Note应用中。 原理是一样&#xff0c;首先&#xff0c;你得有一个表单&#xff0c;我们用html写一个&…

uniapp打包iOS应用并通过审核:代码混淆的终极解决方案 ✨

摘要 本篇博客将教你如何使用 JavaScript-obfuscator 插件来一键发行和混淆 iOS 上的 uniapp 代码。通过安装插件、创建运行脚本&#xff0c;并执行混淆操作&#xff0c;你将能够轻松通过审核&#xff0c;提高应用程序的安全性。&#x1f512; 引言 在将 uniapp 项目打包并上…

【二分答案法】寻找峰值

题目&#xff1a;162. 寻找峰值 - 力扣&#xff08;LeetCode&#xff09; 题目描述&#xff1a; 题目分析&#xff1a; &#xff08;1&#xff09;据题知&#xff0c;索引-1、索引n&#xff08;n为数组长度&#xff09;处的元素都默认为无穷小&#xff0c;我们可以在一开始特判…

逻辑漏洞之越权漏洞

一、越权漏洞简介 越权访问&#xff08;Broken Access Control&#xff0c;简称 BAC&#xff09;是Web应用程序中一种常见的漏洞。它的威胁在于一个账户即可控制全站用户数据。 该漏洞是指应用在检查授权时存在纰漏&#xff0c;使得攻击者在获得低权限用户账户后&#xff0c;利…