在大多數Web應用程式中,需要記錄使用者在系統中的操作流程,以便進行監控、分析和故障排查。在本篇部落格中,將使用Spring Boot框架,結合AOP和紀錄檔框架,實現使用者系統操作流程的記錄。
AOP是一種程式設計正規化,用於解耦橫切關注點(Cross-Cutting Concerns)和業務邏輯。橫切關注點是指應用程式中跨越多個模組和層的通用功能,例如紀錄檔記錄、事務管理、許可權控制等。AOP可以將這些橫切關注點從業務邏輯中分離出來,使得程式碼更加清晰、可維護和可延伸。
首先,需要建立一個新的Spring Boot專案。可以使用Spring Initializr來快速建立一個基本的Spring Boot專案。
在pom.xml
中新增AspectJ的依賴項,以支援AOP的功能。
<dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.9.7</version> <!-- 使用最新版本 --> </dependency>
建立一個切面類,用於記錄使用者系統操作流程。
import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.AfterReturning; import org.aspectj.lang.annotation.Aspect; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; @Aspect @Component public class UserOperationLoggingAspect { private static final Logger logger = LoggerFactory.getLogger(UserOperationLoggingAspect.class); @AfterReturning(value = "@annotation(LogUserOperation)", returning = "returnValue") public void logUserOperation(JoinPoint joinPoint, Object returnValue) { String methodName = joinPoint.getSignature().getName(); String className = joinPoint.getTarget().getClass().getSimpleName(); String logMessage = String.format("User performed operation: %s.%s, Result: %s", className, methodName, returnValue); logger.info(logMessage); } }
建立一個自定義註解LogUserOperation
,用於標註需要記錄使用者操作的方法。
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 LogUserOperation { }
`@Retention`和`@Target`是Java註解的元註解(Meta-Annotations),它們用於定義註解的生命週期和適用目標。讓我們詳細瞭解這兩個元註解的含義:
1. `@Retention(RetentionPolicy.RUNTIME)`
`@Retention`註解用於指定註解的生命週期,即在什麼時候註解資訊可用。`RetentionPolicy.RUNTIME`表示該註解資訊在執行時保留,可以通過反射來獲取。這意味著我們可以在執行時通過Java反射機制獲取被`@Retention(RetentionPolicy.RUNTIME)`修飾的註解資訊,並對註解進行解析和處理。
2. `@Target(ElementType.METHOD)`
`@Target`註解用於指定註解的適用目標,即可以將註解應用於哪些元素上。`ElementType.METHOD`表示該註解可以應用於方法上。在上述程式碼中,`@LogUserOperation`註解可以用於標記方法,即我們可以將`@LogUserOperation`註解應用於方法上,用於記錄使用者系統操作。
綜合起來,`@Retention(RetentionPolicy.RUNTIME)`和`@Target(ElementType.METHOD)`這兩個元註解一起使用,表示`@LogUserOperation`註解在執行時保留,並且可以應用於方法上,以便我們可以在執行時通過反射獲取被該註解修飾的方法,並進行相應的操作。
在需要記錄使用者操作的方法上新增@LogUserOperation
註解。
@RestController public class UserController { @LogUserOperation @PostMapping("/user") public ResponseEntity<User> createUser(@RequestBody User user) { // 儲存使用者到資料庫 userService.saveUser(user); return ResponseEntity.ok(user); } }
在application.properties
或application.yml
組態檔中,設定紀錄檔框架的輸出格式和紀錄檔級別。
logging.level.root=INFO
logging.pattern.console=%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
執行Spring Boot應用程式,並測試觸發帶有@LogUserOperation
註解的方法。將會在紀錄檔中看到記錄的使用者操作流程。
通過使用AOP和紀錄檔框架,可以輕鬆地實現使用者系統操作流程的記錄。在本篇部落格中,介紹了AOP的概念,建立了切面類和自定義註解來記錄使用者操作,然後設定了紀錄檔框架以輸出紀錄檔。這樣,就能夠監控使用者的系統操作,對於故障排查、使用者行為分析和安全審計提供了非常有用的資訊。