一 前言

借助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. 一条指令优化引发的血案,性能狂掉50%,clang使用-ffast-math选项后变傻了

    https://www.cnblogs.com/bbqzsl/p/15510377.html 近期在做优化时,对一些函数分别在不同编译平台上进行bench测试.发现了不少问题. 现在拿其中一个问题来分 ...

  2. GoLang设计模式13 - 观察者模式

    观察者模式是一种行为型设计模式.这种模式允许一个实例(可以称为目标对象)发布各种事件(event)给其他实例(观察者).这些观察者会对目标对象进行订阅,这样每当目标对象发生变化时,观察者就会收到事件( ...

  3. 菜鸡的Java笔记 第十一 - java 封装性

    1.1封装的基础实现.        封装是把过程和数据包围起来,对数据的访问只能通过已定义的接口.面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治.封装的对象,这些对象通过一个受保 ...

  4. vue开发中的一些简单骚操作

    在开发过程中,我们可以定义很多参数,这时需要通过不同的操作来改变不同的参数,这就比较复杂了, 虽然不难,但是代码多了也不好看,这时我们就可以通过简单的操作就行简化: 1.对象使用方括号 let obj ...

  5. PAT A1024题解——高精度大数相加模板

    PAT:A1024 Palindromic Number A number that will be the same when it is written forwards or backwards ...

  6. [bzoj3123]森林

    首先对于询问操作可以使用可持久化线段树来维护,对于连边操作对于两颗树中选取较小的树暴力练到另一个点上,点数可以用并查集然后只修改根的点数即可. 1 #include<bits/stdc++.h& ...

  7. 理解ASP.NET Core - 过滤器(Filters)

    注:本文隶属于<理解ASP.NET Core>系列文章,请查看置顶博客或点击此处查看全文目录 Filter概览 如果你是从ASP.NET一路走过来的,那么你一定对过滤器(Filter)不陌 ...

  8. Codeforces 1383D - Rearrange(构造)

    Codeforces 题面传送门 & 洛谷题面传送门 一道不算困难的构造,花了一节英语课把它搞出来了,题解简单写写吧( 考虑从大往小加数,显然第三个条件可以被翻译为,每次加入一个元素,如果它所 ...

  9. js ajax 请求

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. nginx_install

    [root@MiWiFi-R1CM-srv ~]# yum install -y gcc-c++ zlib zlib-devel openssl openssl-devel pcre-devel pc ...