一 前言

借助spring的AOP功能,我们可以将AOP应用至全局异常处理,全局请求拦截等,本篇文章的核心功能就是使用AOP实现日志记录,比如哪些用户进行了哪些操作,对于一个成功的项目这是必须记录的,故知识追寻者这边给出一个简单模型应用;

二 定义枚举

枚举定义的类型就是实现日志的哪些操作,如下所示,有些是登陆日志,有些是增删改查日志,不同的系统可以定义不同的日志,读者可以自由选择;

public enum LogEnum {

    UNOPERATE(0,"未定义操作"),
SELECT(1,"查询"),
INSERT(2,"添加"),
UPDATE(3,"更新"),
DELETE(4,"删除"),
EXPORT(5,"excel导出"),
LOGIN(6,"登陆"),
LOGOUT(7,"登出"),
; LogEnum( Integer code, String operate) {
this.operate = operate;
this.code = code;
} LogEnum(){ } // 操作
private String operate;
// 操作码
private Integer code; public String getOperate() {
return operate;
} public void setOperate(String operate) {
this.operate = operate;
} public Integer getCode() {
return code;
} public void setCode(Integer code) {
this.code = code;
}
}

三 注解

使用注解的目的就是在哪些方法上使用注解,也就是标记这属于哪些操作,通过注解操作类型结合已经定义的枚举就可以简单的实现哪些方法上进行了哪些操作;

@Documented
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface MonitorLog { /* *
* @Author lsc
* <p>日志内容 </p>
* @Param []
* @Return java.lang.String
*/
String value() default ""; /* *
* @Author lsc
* <p>日志操作类型 </p>
* @Param []
* @Return int
*/
LogEnum operateType() default LogEnum.UNOPERATE; }

四 AOP切面

将注解设置为切点。将切点织入切面后使用环绕通知增强已经被注解标注的方法,此时就可以获得所有的注解操作,然后将日志记录入库,就可以简单实现用户的日志操作监控,当前提是在AOP中获得用户名,常见的shiro框架就有getSubject的方法获得用户名,当然根据不同的读者使用的技术不同进行获取,知识追寻者这边为了简单实现功能就没有使用一堆繁琐的方法去实现一个用户登陆认证系统;

/**
* @Author lsc
* <p>日志aop切面 </p>
*/ @Aspect
@Component
public class LogAsp { /* *
* @Author lsc
* <p> 设置切点</p>
* @Param []
* @Return void
*/
@Pointcut("@annotation(com.zszxz.annotation.MonitorLog)")
public void logPointCut() { } // 环绕通知
@Around("logPointCut()")
public Object around(ProceedingJoinPoint point) throws Throwable {
// 开始时间
LocalDateTime beginTime = LocalDateTime.now();
// 执行方法
Object result = point.proceed();
// 结束时间
LocalDateTime endTime = LocalDateTime.now();
Duration duration = Duration.between(beginTime, endTime);
// 操作时长
long seconds = duration.getSeconds();
// 保存日志
saveLog(point,seconds);
return result;
} private void saveLog(ProceedingJoinPoint point, long seconds){
MethodSignature signature = (MethodSignature) point.getSignature();
Method method = signature.getMethod();
// 获得注解
MonitorLog monitorLog = method.getAnnotation(MonitorLog.class);
if (monitorLog!=null){
// 获得操作类型
LogEnum operateType = monitorLog.operateType();
// 获得操作内容
String value = monitorLog.value();
System.out.printf("获得操作类型: %s , 获得操作内容: %s ",operateType.getCode(),value); //请求的参数
Object[] args = point.getArgs();
try{
List<Object> objects = Arrays.asList(args);
System.out.println(objects);
}catch (Exception e){ } }
}
}

五 表现层

controller 所示,模拟进行查询用户操作的方法,并且在方法上标明注解这是个查询用户的方法,当访问此API时就会被AOP拦截;

/**
* @Author lsc
* <p> </p>
*/
@RestController
public class UserController { private final Logger logger = LoggerFactory.getLogger(this.getClass()); @MonitorLog(value="查询用户",operateType = LogEnum.SELECT)
@GetMapping("zszxz")
public String getUser(String user){
return "zszxz";
} }
 

springboot-使用AOP日志拦截实现的更多相关文章

  1. springboot集成aop日志

    日常开发中假如是前后端完全分离,我们会习惯用浏览器去调用controller的接口来测试.这一个过程普通的日志功能会记录sql参数等一些基本信息.但是假如项目越来越庞大,我们的包越来越多,在维护项目和 ...

  2. Springboot的日志管理&Springboot整合Junit测试&Springboot中AOP的使用

    ==============Springboot的日志管理============= springboot无需引入日志的包,springboot默认已经依赖了slf4j.logback.log4j等日 ...

  3. 【Spring】每个程序员都使用Spring(四)——Aop+自定义注解做日志拦截

    一.前言 上一篇博客向大家介绍了Aop的概念,对切面=切点+通知 .连接点.织入.目标对象.代理(jdk动态代理和CGLIB代理)有所了解了.理论很强,实用就在这篇博客介绍. 这篇博客中,小编向大家介 ...

  4. SpringBoot学习笔记(七):SpringBoot使用AOP统一处理请求日志、SpringBoot定时任务@Scheduled、SpringBoot异步调用Async、自定义参数

    SpringBoot使用AOP统一处理请求日志 这里就提到了我们Spring当中的AOP,也就是面向切面编程,今天我们使用AOP去对我们的所有请求进行一个统一处理.首先在pom.xml中引入我们需要的 ...

  5. springboot整合aop实现网站访问日志记录

    目的: 统一日志输出格式,统计访问网站的ip. 思路: 1.针对不同的调用场景定义不同的注解,目前想的是接口层和服务层. 2.我设想的接口层和服务层的区别在于: (1)接口层可以打印客户端IP,而服务 ...

  6. 【Java分享客栈】超简洁SpringBoot使用AOP统一日志管理-纯干货干到便秘

    前言 请问今天您便秘了吗?程序员坐久了真的会便秘哦,如果偶然点进了这篇小干货,就麻烦您喝杯水然后去趟厕所一边用左手托起对准嘘嘘,一边用右手滑动手机看完本篇吧. 实现 本篇AOP统一日志管理写法来源于国 ...

  7. aop 日志统一处理

    AOP是Aspect Oriented Programing的简称,面向切面编程.AOP适合于那些具有横切逻辑的应用:如性能监测,访问控制,事务管理.缓存.对象池管理以及日志记录.AOP将这些分散在各 ...

  8. Aop实现拦截方法参数

    对于spring框架来说,最重要的两大特性就是AOP 和IOC. 以前一直都知道有这两个东西,在平时做的项目中也常常会涉及到这两块,像spring的事务管理什么的,在看了些源码后,才知道原来事务管理也 ...

  9. SpringBoot切面Aop的demo简单讲解

    前言 本篇文章主要介绍的是SpringBoot切面Aop的demo简单讲解. SpringBoot Aop 说明:如果想直接获取工程那么可以直接跳到底部,通过链接下载工程代码. 切面(Aop) 一.概 ...

随机推荐

  1. 检查redis是否正常运行

    [XX@XXX]$ ps -ef | grep redisXX   8047 1 0 10:06 ? 00:00:03 redis-server *:6379XX   9983 9802 0 11:2 ...

  2. JavaScript复习 1

    概括及使用方法: JavaScript编写规范 一般放在<head>-</head>中间 逐行被执行,越短越好 大小写敏感 语句是基本单位 通常以分号表示语句结束 多行语句可以 ...

  3. 【centos】更换yum源

    yum下载有时候很慢,可以换一下源: 步骤: 1)下载wget yum install -y wget 2)备份默认的yum mv /etc/yum.repos.d /etc/yum.repos.d. ...

  4. 有关unsigned和有符号类型的区别

    相信大家对于unsigned这个玩意并不陌生,但是有的时候却会被它搞懵,比如下面: #include<iostream> using std::cout; using std::cin; ...

  5. 🏆【Alibaba中间件技术系列】「RocketMQ技术专题」帮你梳理RocketMQ或Kafka的选择理由以及二者PK

    前提背景 大家都知道,市面上有许多开源的MQ,例如,RocketMQ.Kafka.RabbitMQ等等,现在Pulsar也开始发光,今天我们谈谈笔者最常用的RocketMQ和Kafka,想必大家早就知 ...

  6. Navicat15最新版本破解 亲测可用!!!(Navicat Premium 注册出现 No All Pattern Found! File Already Patched)

    1.下载Navicat Premium官网https://www.navicat.com.cn/下载最新版本下载安装 2.本人网盘链接:https://pan.baidu.com/s/1ncSaxId ...

  7. go微服务框架Kratos笔记(七)使用jwt认证中间件

    引言 Json web token (JWT) 是一个开放标准(RFC 7519),它定义了一种紧凑的.自包含的方式,特别适用于分布式站点的单点登录(SSO)场景.JWT的声明一般被用来在身份提供者和 ...

  8. cesium开发(1)搭建 vue + cesium开发环境

    进入新公司一段时间了,新公司业务主要从事卫星方面等webgl的开发,主要使用了leafletjs和cesium,其中cesium难度较大,需求较多,再进行了一段时间的使用开发后依旧感到有些力不从心, ...

  9. [loj150]挑战多项式

    以NTT为运算基础,即默认支持在$o(n\log n)$的时间内多项式乘法 二次剩余:称$n$为模$p$意义下的二次剩余,当且仅当存在$x$使得$x^{2}\equiv n(mod\ p)$ 当$p$ ...

  10. [loj3463]表达式求值

    类似cf582E,先建出表达式树,然后树形dp+离散+min和max卷积的优化,复杂度为$o(nm|E|)$,无法通过 考虑我们仅关心于这$n$个数的大小关系,具体来说,假设给出的数组是$a_{i,j ...