详解基于SpringBoot使用AOP技术实现操作日志管理

我来为你详细讲解如何使用AOP技术实现操作日志管理。

基于SpringBoot使用AOP技术实现操作日志管理

什么是AOP

AOP(Aspect Oriented Programming)面向切面编程,是一种编程技术,主要用于解决代码耦合、重复代码等问题。AOP通过把代码横向分离成切面,从而避免了代码的重复。

Java语言中,AOP技术主要通过代理模式和动态字节码生成机制实现,Spring框架中也使用AOP技术。

SpringBoot中使用AOP技术实现操作日志管理

在SpringBoot中,可以通过AOP技术实现操作日志管理。具体实现步骤如下:

  1. 定义日志注解

定义一个标记日志类型的注解,例如@ManageLog注解:

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ManageLog {
    String value() default "";
}
  1. 定义日志实体类

定义一个操作日志的实体类,例如Log实体类:

@Setter
@Getter
@NoArgsConstructor
@AllArgsConstructor
public class Log {
    private String id;
    private String username;
    private String auth;
    private String operation;
    private String description;
    private String method;
    private String params;
    private String ip;
    private Date insertTime;
}
  1. 定义切面

定义一个切面,通过@Around注解拦截方法,并在方法执行前后进行日志记录。切面代码如下:

@Aspect
@Component
@Slf4j
public class LogAspect {
    @Autowired
    private LogService logService;
    @Pointcut("@annotation(cn.edu.cuit.aopdemo.anno.ManageLog)")
    public void pointCut() {}
    @Around("pointCut()")
    public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
        Object result = null;
        try {
            result = joinPoint.proceed();
        } catch (Exception e) {
            throw e;
        } finally {
            saveLog(joinPoint, result);
        }
        return result;
    }
    private void saveLog(ProceedingJoinPoint joinPoint, Object result) {
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
        Method method = signature.getMethod();
        ManageLog manageLog = method.getAnnotation(ManageLog.class);
        Log log = new Log();
        log.setId(UUID.randomUUID().toString());
        log.setAuth(SecurityContextHolder.getContext().getAuthentication().getAuthorities().toString());
        log.setOperation(manageLog.value());
        log.setMethod(signature.getDeclaringTypeName() + "." + signature.getName());
        log.setParams(JSONArray.toJSONString(joinPoint.getArgs()));
        log.setResult(JSONArray.toJSONString(result));
        log.setIp(getIp());
        log.setUsername(SecurityContextHolder.getContext().getAuthentication().getName());
        log.setInsertTime(new Date());
        logService.save(log);
    }
    private String getIp() {
        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
        if (request == null) {
            return "";
        }
        String ip = request.getHeader("x-forwarded-for");
        if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("Proxy-Client-IP");
        }
        if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("WL-Proxy-Client-IP");
        }
        if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getRemoteAddr();
        }
        return ip;
    }
}
  1. 在需要记录日志的方法上添加注解

在需要记录日志的方法上添加@ManageLog标记,例如:

@ManageLog("登录系统")
public User login(String username, String password) {
    // ...
}
  1. 记录日志到数据库

定义一个LogService服务,用于把日志数据存储到数据库中,代码如下:

@Service
public class LogService {
    private final LogMapper logMapper;
    public LogService(LogMapper logMapper) {
        this.logMapper = logMapper;
    }
    public void save(Log log) {
        logMapper.insert(log);
    }
}

示例

下面提供两个使用AOP技术实现操作日志管理的示例。

示例一:记录登录日志

定义一个UserController控制器,代码如下:

@RestController
public class UserController {
    private final UserService userService;
    public UserController(UserService userService) {
        this.userService = userService;
    }
    @ManageLog("用户登录")
    @PostMapping("/login")
    public User login(String username, String password) {
        return userService.login(username, password);
    }
}

上述代码中,@ManageLog("用户登录")注解用于标记该方法为登录操作,当该方法被调用时,AOP切面会拦截该方法,自动记录相关日志信息。

示例二:记录商品增加日志

定义一个ProductController控制器,代码如下:

@RestController
public class ProductController {
    private final ProductService productService;
    public ProductController(ProductService productService) {
        this.productService = productService;
    }
    @ManageLog("增加商品")
    @PostMapping("/product")
    public void add(Product product) {
        productService.add(product);
    }
}

上述代码中,@ManageLog("增加商品")注解用于标记该方法为增加商品操作,当该方法被调用时,AOP切面会拦截该方法,自动记录相关日志信息。

至此,基于SpringBoot使用AOP技术实现操作日志管理的完整攻略已经介绍完毕。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解基于SpringBoot使用AOP技术实现操作日志管理 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • java的Hibernate框架报错“PropertyValueException”的原因和解决方法

    当使用Hibernate框架时,可能会遇到“PropertyValueException”错误。这个错误通常是由于以下原因之一引起的: 实体对象的属性值为null:如果您的实体对象的属性值为null,则可能会出现此错误。在这种情况下,需要检查您的实体对象并确保它们正确。 实体对象的属性值不符合要求:如果您的实体对象的属性值不符合要求,则可能会出现此错误。在这…

    Java 2023年5月4日
    00
  • jsp中checkbox用法详解

    JSP中Checkbox用法详解 在JSP中通过Checkbox可以实现多选以及默认选中的功能,下面我们来详细讲解Checkbox的用法。 CheckBox的基本语法 Checkbox的基本语法如下: <input type="checkbox" name="checkName" value="chec…

    Java 2023年6月15日
    00
  • 让ajax更加友好的实现方法(实时显示后台处理进度。)

    要让ajax更加友好的实现方法中,实时显示后台处理进度是一个非常有用的功能。下面我将详细讲解如何实现它。 1. 实现思路 要实现实时显示后台处理进度,需要前端页面通过ajax向后台发送请求,并通过后台处理程序向前端不断返回处理进度信息,前端页面再根据这些信息动态地更新进度条或显示处理进度百分比等。 具体来说,我们需要按照如下步骤进行实现: 前端页面通过aja…

    Java 2023年6月16日
    00
  • 基于json解析神器 jsonpath的使用说明

    下面是基于Json解析神器JsonPath的使用说明的详细攻略。 什么是JsonPath? JsonPath是一个基于Java的Json解析库,它可以用于解析Json数据并提取其中的内容。JsonPath使用类似XPath的查询语法,并支持大部分XPath表达式,同时还有一些自己的表达式。 如何使用JsonPath 步骤一:引入依赖 要使用JsonPath,…

    Java 2023年5月26日
    00
  • Java的Struts框架报错“ActionForwardInvalidateException”的原因与解决办法

    当使用Java的Struts框架时,可能会遇到“ActionForwardInvalidateException”错误。这个错误通常由以下原因之一起: ActionForward配置错误:如果配置文件中没有正确配置ActionForward,则可能会现此错误。在这种情况下,需要检查文件以解决此问题。 ActionForward无效:如果ActionForwa…

    Java 2023年5月5日
    00
  • java(jsp)整合discuz同步登录功能详解

    下面是详细讲解“java(jsp)整合discuz同步登录功能详解”的攻略。 介绍 Discuz是一个比较古老的论坛系统,它有很多的功能以及插件,而且也有很多网站在使用它。如果你已经有了一个成熟的Java Web网站,那么也许你希望这个网站能够跟Discuz集成起来,实现同步登录的功能。这篇攻略将介绍如何实现Java Web和Discuz之间的同步登录功能。…

    Java 2023年6月15日
    00
  • 详解Tomcat中查看JVM内存使用情况

    当我们使用Tomcat作为Web服务器时,我们需要时刻关注JVM内存的使用情况。在Tomcat的管理界面中提供了一个内置的功能,能够帮助我们查看JVM内存的使用情况。下面是更详细的操作步骤。 第一步:进入Tomcat的管理页面 通过浏览器进入Tomcat服务器的管理页面,一般情况下,默认情况下地址为:http://localhost:8080/manager…

    Java 2023年5月19日
    00
  • java — IO流

    简介 键盘、内存、硬盘、外接设备等与电脑进行交互的数据这种数据的传输,可以看做是一种数据的流动,按照流动的方向,以内存为基准,分为 输入input 和 输出output ,即流向内存是输入流,流出内存的输出流。Java中I/O操作主要是指使用java.io包下的内容,进行输入、输出操作。输入也叫做读取数据,输出也叫做作写出数据。 分类 根据数据的流向分为:输…

    Java 2023年4月18日
    00
合作推广
合作推广
分享本页
返回顶部